You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用正则分割字符串,不丢失(?:[A-Z]|l[oa]s|la|[eé]l)匹配内容?

问题:分割西班牙语句子时保留前缀并找回丢失的条目

原错误代码

import re

sentences_list = ["El coche ((VERB) es) rojo, la bicicleta ((VERB)está) allí; el monopatín ((VERB)ha sido pintado) de color rojo, y el camión también ((VERB)funciona) con cargas pesadas", "El árbol ((VERB es)) grande, las hojas ((VERB)son) doradas y ((VERB)son) secas, los juegos del parque ((VERB)estan) algo oxidados y ((VERB)es) peligroso subirse a ellos"]

aux_list = []
for i_input_text in sentences_list:

    #separator_symbols = r'(?:(?:,|;|\.|\s+)\s*y\s+|,\s*|;\s*)'
    separator_symbols = r'(?:(?:,|;|\.|)\s*y\s+|,\s*|;\s*)(?:[A-Z]|l[oa]s|la|[eé]l)'
    
    pattern = r"\(\(VERB\)\s*\w+(?:\s+\w+)*\)"
    
    # Separar la frase usando separator_symbols
    frases = re.split(separator_symbols, i_input_text)
    
    aux_frases_list = []
    # Buscar el patrón en cada frase separada
    for i_frase in frases:
        verbos = re.findall(pattern, i_frase)
        if verbos:
            aux_frases_list.append(i_frase)
    aux_list = aux_list + aux_frases_list
    
sentences_list = aux_list
print(sentences_list)

当前错误输出

['El coche ((VERB) es) rojo', ' bicicleta ((VERB)está) allí', ' monopatín ((VERB)ha sido pintado) de color rojo', ' camión también ((VERB)funciona) con cargas pesadas', ' hojas ((VERB)son) doradas y ((VERB)son) secas', ' juegos del parque ((VERB)estan) algo oxidados y ((VERB)es) peligroso subirse a ellos']

预期输出

["El coche ((VERB) es) rojo", "la bicicleta ((VERB)está) allí", "el monopatín ((VERB)ha sido pintado) de color rojo", "el camión también ((VERB)funciona) con cargas pesadas", "El árbol ((VERB es)) grande", "las hojas ((VERB)son) doradas y ((VERB)son) secas", "los juegos del parque ((VERB)estan) algo oxidados y ((VERB)es) peligroso subirse a ellos"]

修改后的代码

import re

sentences_list = ["El coche ((VERB) es) rojo, la bicicleta ((VERB)está) allí; el monopatín ((VERB)ha sido pintado) de color rojo, y el camión también ((VERB)funciona) con cargas pesadas", "El árbol ((VERB es)) grande, las hojas ((VERB)son) doradas y ((VERB)son) secas, los juegos del parque ((VERB)estan) algo oxidados y ((VERB)es) peligroso subirse a ellos"]

aux_list = []
# 修正VERB匹配模式,兼容((VERB es))和((VERB) es)两种格式
verb_pattern = r"\(\(VERB(?:\s|\))[^\)]*\)\)"
# 分隔符正则:用捕获组保留需要的前缀,同时修正原正则的空选项问题
separator_symbols = r'(?:(?:,|;|\s+)\s*y\s+|,\s*|;\s*)(\b(?:[A-Z][a-záéíóú]*|l[oa]s|la|[eé]l)\b)'

for i_input_text in sentences_list:
    # 分割时保留捕获的前缀内容
    split_parts = re.split(separator_symbols, i_input_text)
    frases = []
    # 处理第一个片段(开头的句子)
    if split_parts[0].strip():
        frases.append(split_parts[0].strip())
    # 遍历后续的捕获前缀和对应片段,拼接成完整句子
    for i in range(1, len(split_parts), 2):
        prefix = split_parts[i]
        fragment = split_parts[i+1].strip()
        if fragment:
            frases.append(f"{prefix} {fragment}")
    
    # 过滤包含VERB模式的句子
    aux_frases_list = [frase for frase in frases if re.search(verb_pattern, frase)]
    aux_list.extend(aux_frases_list)

sentences_list = aux_list
print(sentences_list)

修改说明

  1. 修正VERB匹配规则:把原模式改为r"\(\(VERB(?:\s|\))[^\)]*\)\)",可以同时匹配((VERB) es)和((VERB es))两种格式,避免丢失包含((VERB es))的句子。
  2. 调整分隔符正则:
    • 用捕获组()包裹需要保留的前缀(l[oa]s|la|[eé]l|[A-Z][a-záéíóú]*),这样re.split会将捕获的前缀保留在分割结果中。
    • 移除原正则中多余的空选项(?:,|;|\.|),修正匹配逻辑,避免错误分割。
  3. 拼接完整句子:遍历分割后的结果,将捕获的前缀和对应的片段拼接,恢复完整的句子结构,同时去掉多余空格。
  4. 过滤有效句子:使用re.search检查每个句子是否包含VERB模式,过滤无效条目。

内容的提问来源于stack exchange,提问作者Matt095

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 16:00:59