[英]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.