繁体   English   中英

Python中的正则表达式:(\\ w)+的​​search()vs findall()

[英]Regular Expression in Python: search() vs findall() for (\w)+

我创建了一个正则表达式为:

agentRegex = re.compile(r'Agent (\w)+')

然后,我执行search()操作为:

agentRegex.search('Agent Alice told Agent Carol that Agent Eve knew Agent Bob was a double agent.').group()

我获得了'Agent Alice'作为输出。

但是当我执行findall()操作时:

agentRegex.findall('Agent Alice told Agent Carol that Agent Eve knew Agent Bob was a double agent.') 

输出为['e', 'l', 'e', 'b']

输出不应该是['Alice Agent', 'Agent Carol', 'Agent Eve', 'Agent Bob']吗?

默认情况下, re.findall()输出已捕获组的列表,在您的情况下(\\w+)

摆脱捕获的组:

Agent \w+

例:

>>> agentRegex = re.compile(r'Agent \w+')

>>> agentRegex.findall('Agent Alice told Agent Carol that Agent Eve knew Agent Bob was a double agent.') 
['Agent Alice', 'Agent Carol', 'Agent Eve', 'Agent Bob']

您的正则表达式:

'Agent (\w)+'

它会继续匹配并捕获'Agent '之后'Agent '单个\\w字符,并会在下次匹配时继续覆盖匹配的组。 那就是您如何获得['e', 'l', 'e', 'b']后缀,这些字符是['Alice', 'Carol', 'Eve', 'Bob']

您在.search().group()得到正确答案,因为group()默认为group(0) ,其中包含所有已匹配的内容,但是如果您执行.search().group(1) ,则将获得['e']

您正在寻找的是捕获代理以及下一个单词。 因此,您可以像heemayl和Dietrich建议的那样尝试。

您也可以这样做:

import re
agentRegex = re.compile(r'Agent\s+[^\s]+')
print agentRegex.findall('Agent Alice told Agent Carol that Agent Eve knew Agent Bob was a double agent.') 
# ['Agent Alice', 'Agent Carol', 'Agent Eve', 'Agent Bob']

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM