python - 为什么正则表达式不捕获初始单词? Python

标签 python regex

为什么我的正则表达式模式没有捕捉到介词前的单词?

我的正则表达式模式试图捕获后面有介词的专有名词。 例如: • 管理学院 --> 学院 • McGraw Hill 图书基金会 --> Foundation of

对于以下文本:

'The Academy of Management Entrepreneurship Division and McGraw Hill present the annual award to individuals who develop and implement an innovation in entrepreneurship pedagogy for either graduate or undergraduate education.'

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

输出:

'的'

为什么不输出'Academy of'?

最佳答案

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

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

pp=r'([A-Z][A-Za-z]+\s+\b(for|of|in|by))\b(?=\s+[A-Z][A-Za-z]+)'
#    ^                                 ^
re.findall(pp,test)

返回:

[('Academy of', 'of')]

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

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

(?:for|of|in|by)

那么唯一会被捕获的是['Academy of']。虽然现在您只剩下一个捕获组,因此您可以完全省去括号,re.findall 将返回与完整正则表达式匹配的所有内容。

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

关于python - 为什么正则表达式不捕获初始单词? Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25127537/

相关文章:

python - 使用 PyQt5 中的菜单栏打开和保存图像文件

c - 使用正则表达式在C linux中查找数字系列

ruby - 使用变量分组使用 ruby​​ 正则表达式解析字符串的更优雅的方法?

javascript - jquery : validate two rules fails using regex

Python 根据应用于集合中元素的函数创建结果并集

python - 我可以让相同值的不同变量指向不同的对象吗?

python - Keras 检查输入 : expected input_4 to have shape (299, 299, 3) 时出错,但得到形状为 (64, 64, 3) 的数组

regex - SED/tr 等.. : How to comment out a line that contains "string" in a file?

c# - 如何进行负面回顾?

python - 如何通过使用公共(public)键对值求和来从字典列表创建单个 Python 字典?