2016-12-14 139 views
-1

我想要一个匹配不在简单引号之间的给定单词的Python正则表达式。我试过使用​​但没有成功。正则表达式:不匹配引号之间的匹配

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

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

这里是链接regex101和样品文字下方是:

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

发布您的试试码 –

+2

您能否指定真正的链接到regex101,而不是屏幕? – RomanPerekhrest

+3

请勿发布屏幕截图 - 在您的代码中进行编辑。 – 2016-12-14 08:37:11

回答

1

一个正则表达式的解决方案下面将在大多数情况下工作,但如果不平衡单引号出现串之外可能会破裂文字,例如在评论中。

通常的正则表达式匹配字符串在上下文匹配你需要替换和匹配和捕获你需要保持。

下面是一个简单的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

正则表达式看起来像

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

regex demo

('[^'\\]*(?:\\.[^'\\]*)*')部分捕获英格尔引号的字符串文字转换为1组,如果它匹配,它只是放回结果,并\bfoe\b匹配整个单词foe在其他任何字符串上下文 - 并且随后被替换为另一个词。

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

+0

谢谢,它的功能非常完美! – Liquiid

+0

很高兴为你效劳,请考虑通过点击左侧的✓接受答案。 [如何接受SO答案](http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work))。 –

1

如何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'] 

这里的关键是要确保表达式不匹配任何字符串与领先和尾随'并记住占据之间的字符,此后.*在重新表达。

+0

自从敌人中的第一个敌人='我是你父亲,敌人! “要匹配=”( – Liquiid

+0

@Liquiid,你说,它不应该单引号之间的匹配?为什么它应该匹配呢?... –

+0

在敌人='.....敌人.... '它应该只与第一个匹配,因为ii没有在引号内。' – Liquiid

1

你可以试试这个: -

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

+0

它不起作用我在regex101 – Liquiid

1

enter image description here

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

它不起作用,如果它匹配一个两个报价之间的敌人。 ='( – Liquiid

+0

@ Liquiid:这些答案都不用理解,但是这对你并没有太大的帮助, –