如果不是子字符串,Python会重新匹配

时间:2014-10-29 13:23:57

标签: python regex

我正在尝试构造一个正则表达式,如果字符串以字符串开头,则匹配 'Isaac'但如果其中有“Asimov”的地方则不匹配,即:

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

我的尝试是:

Isaac.*?(?!Asimov)

失败,以便我的正则表达式始终匹配(我不知道为什么) 有什么想法吗?

3 个答案:

答案 0 :(得分:4)

使用下面的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

答案 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>

你可以轻松地反转比赛......