Skip to main content
 首页 » 编程设计

python之正则表达式,贪婪量词多个捕获组

2025年05月04日26bonelee

我想捕获一个单词 x 周围没有空格的 n 个单词。我需要为每个单词设置一个捕获组。我可以通过以下方式实现这一点(这里是 x 之后的词):

import regex 
n = 2 
x = 'beef tomato chicken trump Madonna' 
right_word = '\s+(\S+)' 
regex_right = r'^\S*{}\s*'.format(n*right_word) 
m_right = regex.search(regex_right, x) 
print(m_right.groups()) 

所以如果 x = '牛肉番茄鸡王牌麦当娜', n = 2, regex_right = '^\S*\s+(\S+)\s+(\S+)\s*',我得到两个包含“番茄”和“鸡肉”的捕获组。但是,如果 n=5 我没有捕获到任何不是我正在寻找的行为。对于 n = 5,我想捕获“牛肉”右侧的所有单词。

我试过使用贪心量词

regex_right = r'^\S*(\s+\S+){,n}\s*' 

但是无论我得到多少匹配项,我都只能得到一个组(最后一个词)(此外,我也得到了空格..)。

我终于尝试使用 regex.findall 但我不能将它限制为 n 个单词但必须指定字符数?

有人可以帮忙吗?


Wiktor 帮助了我(见下文)谢谢。但是我还有一个问题

如果 x = '牛肉、西红柿、鸡肉、王牌麦当娜' 我无法弄清楚如何在没有逗号的情况下进行捕获?我不希望群组像“番茄”,

请您参考如下方法:

您没有使用第一种方法匹配所有这些词,因为模式与输入字符串不匹配。您需要使用 (?:...)? 将 right_word 模式可选括起来:

import re 
x = 'beef tomato chicken trump Madonna' 
n = 5 
right_word = '(?:\s+(\S+))?' 
regex_right = r'^\S*{}'.format(n*right_word) 
print(regex_right) 
m_right = re.search(regex_right, x) 
if m_right: 
    print(m_right.groups()) 

参见 Python demo .

第二种方法仅适用于 PyPi 正则表达式模块,因为 Python re 不保留重复捕获,一旦量化的捕获组在同一匹配迭代中再次匹配子字符串,其值将被重写.

>>> right_word = '\s+(\S+)' 
>>> n = 5 
>>> regex_right = r'^\S*(?:\s+(\S+)){{1,{0}}}'.format(n) 
>>> result = [x.captures(1) for x in regex.finditer(regex_right, "beef tomato chicken trump Madonna")] 
>>> result 
[['tomato', 'chicken', 'trump', 'Madonna']] 
>>> print(regex_right) 
^\S*(?:\s+(\S+)){1,5} 

请注意 ^\S*(?:\s+(\S+)){1,5} 在量化的非捕获组中有一个捕获组 #1,该组使用 {1,5} 限制量词,并且由于 PyPi 正则表达式跟踪通过重复捕获组捕获的所有值,因此它们都可以通过此处的 .captures(1) 访问。您可以使用 .NET regex tester 测试此功能: