2014-06-19 374 views
1

我想匹配字符串一樣:如何在Python中使用正則表達式排除特定的字符串?

45 meters? 
45, meters? 
45? 
45 ? 

但不是字符串,如:

45 meters you? 
45 you ? 
45, and you? 

在這兩種情況下的問號必須結束。所以,基本上我想排除所有包含單詞「你」的字符串。

我試過以下的正則表達式:

'\d+.*(?!you)\?$' 

但第二種情況(可能是因爲.*

+0

不能老是you' –

+0

它可能在任何地方,但現在我感興趣的時候,它發生在最後,謝謝。 –

+0

我的意思是「任何地方」的意義上,在「你」和'''可能會有一些空格 –

回答

3

你可以試試這個正則表達式匹配所有不具有行匹配字符串you?在最後,

^(?!.*you).*\?$ 

說明:

在這個正則表達式中使用負向前視。它實際上意味着什麼,它檢查包含字符串you的行。它匹配除包含字符串you的行之外的所有行。

DEMO

+0

如果單詞是'你',OP只希望它放棄匹配。 –

+0

您正則表達式將無法匹配'42的測試儀':http://regex101.com/r/qM1mV6 –

+1

對不起,但我需要'.',因爲它甚至應該匹配'45米' –

4

有一個neat trick從一個正則表達式,您可以使用這裏排除一些比賽:

>>> import re 
>>> corpus = """ 
... 45 meters? 
... 45? 
... 45 ? 
... 45 meters you? 
... 45 you ? 
... 45, and you? 
... """ 
>>> pattern = re.compile(r"\d+[^?]*you|(\d+[^?]*\?)") 
>>> re.findall(pattern, corpus) 
['45 meters?', '45?', '45 ?', '', '', ''] 

的缺點是,你得到空匹配時排除踢,但這些都是輕鬆過濾掉:

>>> filter(None, re.findall(pattern, corpus)) 
['45 meters?', '45?', '45 ?'] 

工作原理:

訣竅是,我們只關注捕獲的組......所以左側的變化 - \d+[^?]*you(或「數字後跟非 - ? - 字符後跟'你')匹配你的不要想要,然後我們忘記它。只有在左側不匹配的右手邊 - (\d+[^?]*\?)(或「數字其次是非 - ? - 字符後跟‘?’) - 相匹配,並且一個被捕獲

+0

+1。我用同樣的方法寫了一個答案,但你速度更快。 –

相關問題