正则表达式:匹配词不在引号之间


问题内容

我想要一个Python正则表达式,它匹配不在简单引号之间的给定单词。我尝试使用,(?! ...)但没有成功。

在以下屏幕截图中,我希望匹配foe第四行中的所有内容。

另外,文本作为一个大字符串给出。

这是链接regex101,示例文本如下:

var foe = 10;
foe = "";
dark_vador = 'bad guy'
foe = ' I\'m your father, foe ! '
bar = thingy + foe

问题答案:

下面的正则表达式解决方案在大多数情况下都可以使用,但是如果不平衡的单引号出现在字符串文字之外(例如在注释中),则可能会中断。

在上下文中匹配字符串的常规正则表达式技巧是匹配您需要替换的内容,以及匹配并 捕获 您需要保留的内容。

这是一个示例Python演示:

import re
rx = r"('[^'\\]*(?:\\.[^'\\]*)*')|\b{0}\b"
s = r"""
    var foe = 10;
    foe = "";
    dark_vador = 'bad guy'
    foe = ' I\'m your father, foe ! '
    bar = thingy + foe"""
toReplace = "foe"
res = re.sub(rx.format(toReplace), lambda m: m.group(1) if m.group(1) else 'NEWORD', s)
print(res)

参见Python演示

正则表达式看起来像

('[^'\\]*(?:\\.[^'\\]*)*')|\bfoe\b

请参阅regex演示

('[^'\\]*(?:\\.[^'\\]*)*')部分将用单引号引起来的字符串文字捕获到组1中,如果匹配,则将其放回结果中,并在任何其他字符串上下文中\bfoe\b匹配整个单词foe-随后被另一个单词替换。

注意
:要也匹配双引号字符串文字,请使用r"('[^'\\]*(?:\\.[^'\\]*)*'|\"[^\"\\]*(?:\\.[^\"\\]*)*\")"