我正在使用以下模式来清除一段文本(将匹配项替换为null):
{\s{\s\"[A-Za-z0-9.,\-:]*(?<!\bbecause\b)(?<!\bsince\b)\"\s}\s\"[A-Za-z0-9.,\-:]*\"\s}
我有一个相关列表,例如“因为”和“自此”,它们可能每次都更改。所以我创建了一个单独的字符串,它本身就是一个正则表达式,例如:
lookahead_string = (?<!\bbecause\b)(?<!\bsince\b)
将其放在我原来的正则表达式模式中,并进行如下更改:
{\s{\s\"[A-Za-z0-9.,\-:]*'+lookahead_string+r'\"\s}\s\"[A-Za-z0-9.,\-:]*\"\s}
但是新模式与原始正则表达式模式可以匹配的输入文本部分不匹配。我正在使用的代码是:
lookahead_string = ''
relators = ["because", "since"]
for rel in relators:
lookahead_string += '(?<!\b'+rel+'\b)'
text = re.sub(r'{\s{\s\"[A-Za-z0-9.,\-:]*'+lookahead_string+r'\"\s}\s\"[A-Za-z0-9.,\-:]*\"\s}', "", text)
text = ' '.join(text.split())
我应该怎么做才能使其正常工作?我已经尝试过使用re.escape
和format
字符串,但是在我的情况下它们都不起作用。
编辑:我删除了输入输出文本,因为我认为这有点令人困惑。但是,我感谢@DYZ的好建议。
答案 0 :(得分:1)
建议:不要将复杂的字符串语法弄乱,而是将字符串转换为Python列表。
import ast
l = ast.literal_eval("[" + s.replace("}", "],").replace("{", "[") + "]")
#[[[[['I'], 'PRP'], 'NP'], [[[[['did'], 'VBD'], [['not'], 'RB'], 'VP'],
# ..., 'S'], '']
现在,您可以将简单的列表函数应用于数据,完成后将列表转换为带括号的字符串。