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

2024-10-04 11:33:52 发布

您现在位置:Python中文网/ 问答频道 /正文

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

在下面的屏幕截图中,我想匹配除第4行之外的所有foe。在

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

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

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

Tags: 字符串文本示例your屏幕链接var单词
3条回答

你可以试试这:在

((?!\'[\w\s]*)foe(?![\w\s]*\'))

关于this正则表达式如何:

>>> s = '''var foe = 10;
foe = "";
dark_vador = 'bad guy'
' I\m your father, foe ! '
bar = thingy + foe'''
>>>
>>> re.findall(r'(?!\'.*)foe(?!.*\')', s)
['foe', 'foe', 'foe']

这里的诀窍是确保表达式不匹配任何带有前导和尾随'的字符串,并记住要考虑中间的字符,然后是re表达式中的.*。在

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

在上下文中匹配字符串的一个常见的regex技巧是匹配需要替换和匹配的内容,并捕获需要保留的内容。在

下面是一个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 demo

正则表达式看起来像

^{pr2}$

参见regex demo。在

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

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

相关问题 更多 >