我試圖構造一個正則表達式,如果字符串以 「艾薩克」開頭,但如果是在某個地方「阿西莫夫的不匹配一致,即:Python的重新匹配,如果不串
"Isaac Peter bla hello" -> match
"Isaac Peter bla Asimov hello" -> no match
我的嘗試是:
Isaac.*?(?!Asimov)
從而未能讓自己的正則表達式總是匹配(我不知道爲什麼) 任何想法?
我試圖構造一個正則表達式,如果字符串以 「艾薩克」開頭,但如果是在某個地方「阿西莫夫的不匹配一致,即:Python的重新匹配,如果不串
"Isaac Peter bla hello" -> match
"Isaac Peter bla Asimov hello" -> no match
我的嘗試是:
Isaac.*?(?!Asimov)
從而未能讓自己的正則表達式總是匹配(我不知道爲什麼) 任何想法?
使用下面的negative lookahead。
^Isaac(?!.*?Asimov).*$
>>> 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
謝謝,有時我是一個傻瓜:) – ProfHase85 2014-10-29 13:29:09
我們真的需要一個向前看嗎?速度更快還是我的簡單解決方案類似? – wenzul 2014-10-29 13:35:56
@wenzul你的解決方案不提供我所需要的:你的解決方案與我需要的相反,我沒有選擇反轉正則表達式,如果你對背景感興趣,請看這裏: http://docs.ansible .com/lineinfile_module.html 這個模塊用正則表達式替換了一行,沒有反選等選項 – ProfHase85 2014-10-29 13:38:54
或者沒有正則表達式:
if str.startswith('Isaac') and 'Asimov' not in str:
# ...
我需要一個正則表達式(for ansible module;)) – ProfHase85 2014-10-29 13:29:31
如果你只需要匹配和不希望有您可以使用
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>
您可以輕鬆地反轉匹配組...
你是什麼意思由* *失敗? – dursk 2014-10-29 13:24:54
這種情況不適用於'regex'。可以很容易地用字符串來完成。 – 2014-10-29 13:29:08
失敗我的意思是它匹配一切 – ProfHase85 2014-10-29 13:30:19