首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python正则表达式并不匹配所有预期的单词。

Python正则表达式并不匹配所有预期的单词。
EN

Stack Overflow用户
提问于 2015-08-11 18:39:23
回答 2查看 130关注 0票数 1

在regexr.com上,我开发了一个与特定类型的专有名称相匹配的正则表达式。下面是这样的表达:

代码语言:javascript
复制
\b([a-z]?[A-Z]+[\w]*[ ]*)+\b

您可以看到,在http://regexr.com/3bifh中,大量的示例正在按预期进行匹配。

例如,根据赫尔曼·梅尔维尔的“白鲸”或“白鲸”,它与Moby DickWhite WhaleHerman Melville相匹配

我试图在Python中复制这个结果,但效果不太好。下面是代码:

代码语言:javascript
复制
import re

text = "Moby Dick or the White Whale by Herman Melville"
print(re.findall(r"\b([a-z]?[A-Z]+[\w]*[ ]*)+\b", text))

产出如下:

代码语言:javascript
复制
['Dick ', 'Whale ', 'Melville']

这只匹配上面每个结果的最后一部分。为什么这个表达式在Python中不起作用?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-08-11 18:42:37

Regex引擎只记得多个组匹配时的最后一组。

你可以用这个代替

代码语言:javascript
复制
 print (re.findall(r"\b((?:[a-z]?[A-Z]+[\w]*[ ]*)+)\b", text))
票数 2
EN

Stack Overflow用户

发布于 2015-08-11 18:42:41

将捕获组转换为非捕获组。

代码语言:javascript
复制
print(re.findall(r"\b(?:[a-z]?[A-Z]+[\w]*[ ]*)+\b", text))

参见这里,它与第一部分匹配,但捕获了第二部分。re.findall将优先考虑捕获,然后是匹配。所以它打印出了第二部分。

改变你的模式,如打击,如果你不想匹配尾随空格字符。

代码语言:javascript
复制
r'\b[a-z]?[A-Z]+\w*(?: [a-z]?[A-Z]+\w*)+'

演示

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

https://stackoverflow.com/questions/31949535

复制
相关文章

相似问题

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