2014-10-29 54 views
1

我試圖構造一個正則表達式,如果字符串以 「艾薩克」開頭,但如果是在某個地方「阿西莫夫的不匹配一致,即:Python的重新匹配,如果不串

"Isaac Peter bla hello" -> match 
"Isaac Peter bla Asimov hello" -> no match 

我的嘗試是:

Isaac.*?(?!Asimov) 

從而未能讓自己的正則表達式總是匹配(我不知道爲什麼) 任何想法?

+0

你是什麼意思由* *失敗? – dursk 2014-10-29 13:24:54

+1

這種情況不適用於'regex'。可以很容易地用字符串來完成。 – 2014-10-29 13:29:08

+0

失敗我的意思是它匹配一切 – ProfHase85 2014-10-29 13:30:19

回答

3

使用下面的negative lookahead

^Isaac(?!.*?Asimov).*$ 

DEMO

>>> import re 
>>> s = """Isaac Peter bla hello 
... Isaac Peter bla Asimov hello""" 
>>> re.findall(r'(?m)^Isaac(?!.*?Asimov).*$', s) 
['Isaac Peter bla hello'] 

說明:

^      the beginning of the string 
Isaac     'Isaac' 
(?!      look ahead to see if there is not: 
    .*?      any character except \n (0 or more 
          times) 
    Asimov     'Asimov' 
)      end of look-ahead 
.*      any character except \n (0 or more times) 
$      before an optional \n, and the end of the 
         string 
+0

謝謝,有時我是一個傻瓜:) – ProfHase85 2014-10-29 13:29:09

+0

我們真的需要一個向前看嗎?速度更快還是我的簡單解決方案類似? – wenzul 2014-10-29 13:35:56

+0

@wenzul你的解決方案不提供我所需要的:你的解決方案與我需要的相反,我沒有選擇反轉正則表達式,如果你對背景感興趣,請看這裏: http://docs.ansible .com/lineinfile_module.html 這個模塊用正則表達式替換了一行,沒有反選等選項 – ProfHase85 2014-10-29 13:38:54

1

或者沒有正則表達式:

if str.startswith('Isaac') and 'Asimov' not in str: 
    # ... 
+0

我需要一個正則表達式(for ansible module;)) – ProfHase85 2014-10-29 13:29:31

0

如果你只需要匹配和不希望有您可以使用

import re 
>>> a="Isaac Peter bla hello" 
>>> b="Isaac Peter bla Asimov hello" 
>>> re.match(r"^Isaac.*Asimov.*$", a) 
>>> re.match(r"^Isaac.*Asimov.*$", b) 
<_sre.SRE_Match object at 0x0000000001D4E9F0> 

您可以輕鬆地反轉匹配組...