regex 仅当单词未出现在子字符串列表中时,才使用此正则表达式模式匹配单词

8xiog9wr  于 2023-01-31  发布在  其他
关注(0)|答案(1)|浏览(92)
import re

input_text = "a áshgdhSdah saasas a corrEr, assasass a saltó sasass a sdssaa" #example

list_verbs_in_this_input = ["serías", "serían", "sería", "ser", "es", "corré", "corrió", "corría", "correr", "saltó", "salta", "salto", "circularías", "circularía", "circulando", "circula", "consiste", "consistían", "consistía", "consistió", "ladró", "ladrando", "ladra", "visualizar", "ver", "vieron", "vió"]

noun_pattern = r"((?:\w+))" # pattern that doesnt tolerate whitespace in middle

imput_text = re.sub(r"(?:^|\s+)a\s+" + noun_pattern, 
                    "\(\g<0>\)", 
                    input_text, re.IGNORECASE)

print(repr(input_text)) # --> output

我需要使用类似于re.compile(r"(?:" + rf"({'|'.join(list_verbs_in_this_input)})" + r"|[.;\n]|$)", flags = re.IGNORECASE)的正则表达式模式,使用该正则表达式来标识和替换"((?:\w+))"之间不包含空格的子字符串(如果该子字符串位于行首或前面有“a”"(?:^|\s+)a\s+"),前提是"((?:\w+))"与列表list_verbs_in_this_input或点.中的任何字符串都不匹配

正确的输出应如下所示:

'(áshgdhSdah) saasas a corrEr, assasass a saltó sasass (sdssaa)'

请注意,子字符串"a corrEr""a saltó"未被修改,因为它们包含list_verbs_in_this_input列表中的子字符串(单词

bvn4nwqk

bvn4nwqk1#

要排除某些单词,可以在要匹配的单词的开头使用否定的前瞻Assert。
需要更正的几件事:

  • re.sub将标志作为第5个参数,而不是第4个参数
  • "\("不是转义序列,因此您应该直接执行"(\g<0>)",而不要“转义”括号--它们在该字符串中没有特殊含义。
  • r"(?:^|\s+)a\s+"将始终 * 要求 * a在那里。从您的描述中,我了解到当单词位于行首时,a可能是可选的,因此r"(?:\ba\s|^)\s*"
  • 在应该匹配禁用单词的正则表达式中,确保要求单词在匹配后立即结束,因此在模式中添加\b

以下是您可以执行的操作:

import re

input_text = "a áshgdhSdah saasas a corrEr, assasass a saltó sasass a sdssaa" #example

list_verbs_in_this_input = ["serías", "serían", "sería", "ser", "es", "corré", "corrió", "corría", "correr", "saltó", "salta", "salto", "circularías", "circularía", "circulando", "circula", "consiste", "consistían", "consistía", "consistió", "ladró", "ladrando", "ladra", "visualizar", "ver", "vieron", "vió"]

noun_pattern = r"\w+"
exclude = rf"(?!\b(?:{'|'.join(list_verbs_in_this_input)})\b)"
article = r"(?:\ba\s|^)\s*"
regex = article + exclude + noun_pattern

input_text = re.sub(regex, "(\g<0>)", input_text, flags=re.I|re.U)

print(repr(input_text))

相关问题