正则表达式,贪婪量化多个捕获组

时间:2017-05-17 08:55:50

标签: python regex

我想在没有空格的情况下捕获围绕单词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 ='牛肉,番茄,鸡肉,特朗普麦当娜' 我不明白如何捕捉没有逗号?我不希望团体成为番茄,'

2 个答案:

答案 0 :(得分:5)

您没有将所有这些单词与第一种方法匹配,因为该模式与输入字符串不匹配。您需要将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 testerenter image description here

测试此功能

答案 1 :(得分:0)

你得到了正确的方法。然而,正则表达式无法满足您的要求。每次捕获组捕获另一个模式时,都会替换先前的内容。这就是为什么您的捕获组仅返回捕获的最后一个模式的原因 您可以轻松匹配n个单词,但无法单独捕获它们而无需明确写入每个捕获组。