我想捕获一个单词 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 测试此功能:
