我想在没有空格的情况下捕获围绕单词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())
Run Code Online (Sandbox Code Playgroud)
所以,如果x ='牛肉番茄鸡王牌麦当娜',n = 2,regex_right = '^\S*\s+(\S+)\s+(\S+)\s*'我得到两个含有'番茄'和'鸡'的捕获组.但是,如果n = 5,我没有捕获任何不是我正在寻找的行为.对于n = 5,我想捕获'牛肉'权利的所有单词.
我尝试过使用贪心量词
regex_right = r'^\S*(\s+\S+){,n}\s*'
Run Code Online (Sandbox Code Playgroud)
但是我只得到一个组(最后一个字),无论我得到多少匹配(此外我也得到了白色空间......).
我终于尝试使用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())
Run Code Online (Sandbox Code Playgroud)
请参阅Python演示.
第二种方法仅适用于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}
Run Code Online (Sandbox Code Playgroud)
请注意,^\S*(?:\s+(\S+)){1,5}在量化的非捕获组中有一个捕获组#1,该组使用{1,5}限制量词进行量化,并且由于PyPi正则表达式记录了使用重复捕获组捕获的所有值,因此可以通过.captures(1)此处访问它们.您可以使用.NET regex测试器测试此功能: