2016-12-14 134 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:這些答案都不用理解,但是這對你並沒有太大的幫助, –