首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么regex不捕获最初的单词?Python

为什么regex不捕获最初的单词?Python
EN

Stack Overflow用户
提问于 2014-08-04 21:05:40
回答 4查看 119关注 0票数 3

为什么我的regex模式没有抓住介词前的单词?

我的regex模式是试图捕捉在它们后面有介词的专有名词。例如:·管理学院

关于下列案文:

“管理学院创业部和McGraw Hill颁发年度奖给那些为研究生或本科教育开发和实施创业教育学创新的个人。”

代码语言:javascript
复制
pp = r'[A-Z][A-Za-z]+\s+\b(for|of|in|by)\b(?=\s+[A-Z][A-Za-z]+)'

x2 = re.findall(pp,test)

x2

产出:

“‘of”

为什么它不输出“学院”?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-08-04 21:12:17

捕获组是括在括号( )中的正则表达式的一部分。它们用于从匹配表达式中提取特定部分。看起来你是偶然遇到他们的,因为你用一个来匹配"for“、"of”、"in“或" by”。

当表达式中有一个捕获组时(如问题中所示),re.findall将返回该组的匹配列表。目前,在正则表达式的第一部分没有任何组。如果您也想捕获它,还必须将它括在括号中:

代码语言:javascript
复制
pp=r'([A-Z][A-Za-z]+\s+\b(for|of|in|by))\b(?=\s+[A-Z][A-Za-z]+)'
#    ^                                 ^
re.findall(pp,test)

返回:

代码语言:javascript
复制
[('Academy of', 'of')]

现在,re.findall返回了一个元组列表,因为现在有多个捕获组。元组的元素按组开始的顺序显示。

如果不想与其他组相匹配,则可以将其更改为非捕获:

代码语言:javascript
复制
(?:for|of|in|by)

然后将捕获的唯一东西是['Academy of']。尽管现在只剩下一个捕获组,所以您可以完全取消括号,re.findall将返回与完整正则表达式匹配的任何内容。

代码语言:javascript
复制
pp=r'[A-Z][A-Za-z]+\s+\b(?:for|of|in|by)\b(?=\s+[A-Z][A-Za-z]+)'
票数 3
EN

Stack Overflow用户

发布于 2014-08-04 21:10:34

只需在介词前面加上一个捕获组:

pp = r'([A-Z][A-Za-z]+)\s+\b(for|of|in|by)\b(?=\s+[A-Z][A-Za-z]+)'

或者,如果您想捕获整个单词/介词字符串:

pp = r'([A-Z][A-Za-z]+\s+\b(?:for|of|in|by))\b(?=\s+[A-Z][A-Za-z]+)'

票数 3
EN

Stack Overflow用户

发布于 2014-08-04 21:10:37

实际的regex搜索就像您所期望的一样有效。让您感到震惊的是,在for|of|in|by周围的括号中引入了一个捕获组。

来自re.findall() 文档

如果模式中存在一个或多个组,则返回组列表。

下面是如何修复这个问题:

代码语言:javascript
复制
pp = r'[A-Z][A-Za-z]+\s+\b(?:for|of|in|by)\b(?=\s+[A-Z][A-Za-z]+)'
                           ^^

(?:...)非俘获群。这样,re.findall()将返回整个匹配。

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

https://stackoverflow.com/questions/25127537

复制
相关文章

相似问题

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