我正在尝试构造一个正则表达式,如果字符串以字符串开头,则匹配 'Isaac'但如果其中有“Asimov”的地方则不匹配,即:
"Isaac Peter bla hello" -> match
"Isaac Peter bla Asimov hello" -> no match
我的尝试是:
Isaac.*?(?!Asimov)
失败,以便我的正则表达式始终匹配(我不知道为什么) 有什么想法吗?
答案 0 :(得分:4)
使用下面的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
答案 1 :(得分:1)
或者,没有正则表达式:
if str.startswith('Isaac') and 'Asimov' not in str:
# ...
答案 2 :(得分: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>
你可以轻松地反转比赛......