Regex,贪婪量词多个捕获组

2024-05-14 16:42:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我想捕捉n个单词x周围没有空格的单词。我需要一个捕捉组来记录每个单词。我可以通过以下方式实现这一点(以下是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,我想捕捉“牛肉”右边的所有单词。在

我试过用贪婪量词

^{pr2}$

但是我只得到一个组(最后一个词),不管我得到多少匹配(而且我也得到了空白)。在

我终于试着用正则表达式findall但我不能把它限制在n个单词,而是必须指定字符数?在

有人能帮忙吗?在


维克托帮了我(见下文)谢谢。不过,我还有一个问题

如果 x='牛肉,番茄,鸡肉,特朗普麦当娜' 我想不出没有逗号怎么捕捉?我不想把“西红柿”这一组


Tags: importright方式记录单词regexword空格
2条回答

因为模式与输入字符串不匹配,所以没有将所有这些单词与第一种方法匹配。您需要将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 regex模块,因为Pythonre不保留重复的捕获,一旦量化的捕获组在相同的匹配迭代中再次匹配子字符串,它的值将被重新写入。在

^{pr2}$

注意,^\S*(?:\s+(\S+)){1,5}在用{1,5}限定量词量化的量化非捕获组中有一个捕获组1,并且由于PyPi regex跟踪用重复捕获组捕获的所有值,因此可以通过此处的.captures(1)访问这些值。您可以使用.NET regex tester:enter image description here测试此功能

你找到了正确的方法。但是regex不能满足你的要求。每次捕获组捕获另一个模式时,以前的内容都会被替换。这就是为什么您的捕获组只返回最后捕获的模式。
可以很容易地匹配n个单词,但是如果不显式地编写每个捕获组,则无法分别捕获它们。在

相关问题 更多 >

    热门问题