首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python常规exp来阻止贪婪扩展到超过一行

Python常规exp来阻止贪婪扩展到超过一行
EN

Stack Overflow用户
提问于 2018-07-07 00:54:24
回答 2查看 57关注 0票数 2

我有一个这样的字符串:

代码语言:javascript
复制
Name is A, Last:B
Last Login: 10 min

我只想提取姓名和上次登录时间

当我使用如下所示的regex时

代码语言:javascript
复制
 Name is ([A-Z])[\s\w,:]+ 

它变得贪婪,匹配了整个字符串,所以我无法提取上次登录时间(10分钟)。我如何阻止贪婪超出一行?

对此有什么帮助吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-07-07 02:33:53

给定:

代码语言:javascript
复制
>>> print s
Name is A, Last:B
Last Login: 10 min

您可以使用带有re.M多行标志的re.search来捕获该模式:

代码语言:javascript
复制
>>> re.search(r"^(Name is[^,]*).*\s*(^Last Login:.*)",s,re.M).groups()
('Name is A', 'Last Login: 10 min')

或者,如果您只想要固定字段之后的数据:

代码语言:javascript
复制
>>> re.search(r"^Name is\s*([^,]*).*\s*^Last Login:\s*(.*)",s,re.M).groups()
('A', '10 min')

或者,您可以使用look behinds来查看您想要的字段,然后捕获以下内容:

代码语言:javascript
复制
>>> re.search(r"(?<=Name is)\s*([^,]*),.*\n.*(?<=Last Login:)\s*(.*)",s).groups()
('A', '10 min')
票数 0
EN

Stack Overflow用户

发布于 2018-07-07 02:17:13

我不能完全确定您试图用[\s\w,:]+避免什么,但是您可以直接使用"Name is ([A-Z]\w*), Last:([A-Z]\w*)\nLast Login: (\d+)"

代码语言:javascript
复制
>>> re.match(r"Name is ([A-Z]\w*), Last:([A-Z]\w*)\nLast Login: (\d+)",
...          'Name is A, Last:B\nLast Login: 10 min').groups()
('A', 'B', '10')

只要re.dotall未激活,您就可以使用.+,它不会匹配换行符。

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

https://stackoverflow.com/questions/51214790

复制
相关文章

相似问题

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