首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python重新匹配(如果不是子字符串)

Python重新匹配(如果不是子字符串)
EN

Stack Overflow用户
提问于 2014-10-29 13:23:56
回答 3查看 588关注 0票数 1

我正试图构造一个正则表达式,如果字符串以“艾萨克”开头,则该表达式与之匹配,但如果字符串中有“Asimov”,则不匹配,即:

代码语言:javascript
复制
"Isaac Peter bla hello" -> match
"Isaac Peter bla Asimov hello" -> no match

我的尝试是:

代码语言:javascript
复制
Isaac.*?(?!Asimov)

这是失败的,所以我的正则表达式总是匹配(我不知道为什么),任何想法?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-10-29 13:26:29

使用如下所示的负前瞻

代码语言:javascript
复制
^Isaac(?!.*?Asimov).*$

演示

代码语言:javascript
复制
>>> import re
>>> s = """Isaac Peter bla hello
... Isaac Peter bla Asimov hello"""
>>> re.findall(r'(?m)^Isaac(?!.*?Asimov).*$', s)
['Isaac Peter bla hello']

解释:

代码语言:javascript
复制
^                        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
票数 4
EN

Stack Overflow用户

发布于 2014-10-29 13:26:44

或者,没有regex:

代码语言:javascript
复制
if str.startswith('Isaac') and 'Asimov' not in str:
    # ...
票数 1
EN

Stack Overflow用户

发布于 2014-10-29 13:29:05

如果您只需要匹配,并且不想拥有可以使用的组

代码语言:javascript
复制
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>

你可以很容易地倒置火柴..。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26631551

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档