我想在没有空格的情况下捕获围绕单词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 ='牛肉,番茄,鸡肉,特朗普麦当娜' 我不明白如何捕捉没有逗号?我不希望团体成为番茄,'
答案 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 tester:
答案 1 :(得分:0)
你得到了正确的方法。然而,正则表达式无法满足您的要求。每次捕获组捕获另一个模式时,都会替换先前的内容。这就是为什么您的捕获组仅返回捕获的最后一个模式的原因 您可以轻松匹配n个单词,但无法单独捕获它们而无需明确写入每个捕获组。