如何在正则表达式中使用正则表达式变量?

时间:2018-07-31 18:08:03

标签: python regex

我正在使用以下模式来清除一段文本(将匹配项替换为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.escapeformat字符串,但是在我的情况下它们都不起作用。

  

编辑:我删除了输入输出文本,因为我认为这有点令人困惑。但是,我感谢@DYZ的好建议。

1 个答案:

答案 0 :(得分:1)

建议:不要将复杂的字符串语法弄乱,而是将字符串转换为Python列表。

import ast
l = ast.literal_eval("[" + s.replace("}", "],").replace("{", "[") + "]")
#[[[[['I'], 'PRP'], 'NP'], [[[[['did'], 'VBD'], [['not'], 'RB'], 'VP'],
#  ..., 'S'], '']

现在,您可以将简单的列表函数应用于数据,完成后将列表转换为带括号的字符串。