学习 python 的正则表达式。我要感谢 Jerry 在这个问题上最初提供的帮助。我测试了这个正则表达式:
(\b\w+\b)?[^a-z]*(\b\w+\b)?[^a-z]*(\b\w+\b)?[^a-z]*(\b\w+\b)?[,;]\s*(\b\w+\b)?[^a-z]*(\b\w+\b)?[^a-z]*(\b\w+\b)?[^a-z]*(\b\w+\b)?
在 http://regex101.com/它找到了我要找的东西,也就是句子中逗号前的四个词和逗号后的四个词。如果句子开头的逗号前有三个两个词,它就不会崩溃。我使用的测试语句是:
waiting for coffee, waiting for coffee and the charitable crumb.
现在正则表达式返回:
[('waiting', 'for', 'coffee', '', 'waiting', 'for', 'coffee', 'and')]
我不太明白为什么集合的第四个成员是空的。在这种情况下,我想要的是正则表达式只返回逗号前的 3 和逗号后的 4,但如果逗号前有四个单词,我希望它返回四个。我知道正则表达式因语言而异,这是我在 python 中缺少的东西吗?
最佳答案
您有可选组:
(\bw+\b)?
问号使它成为一个可选的匹配项。但是 Python 将始终返回模式中的所有 组,并且对于任何不匹配任何内容的组,将返回一个空值(通常是None
):
>>> import re
>>> example = 'waiting for coffee, waiting for coffee and the charitable crumb.'
>>> pattern = re.compile(r'(\b\w+\b)?[^a-z]*(\b\w+\b)?[^a-z]*(\b\w+\b)?[^a-z]*(\b\w+\b)?[,;]\s*(\b\w+\b)?[^a-z]*(\b\w+\b)?[^a-z]*(\b\w+\b)?[^a-z]*(\b\w+\b)?')
>>> pattern.search(example).groups()
('waiting', 'for', 'coffee', None, 'waiting', 'for', 'coffee', 'and')
请注意输出中的 None
,这是逗号前的第 4 个词组不匹配任何内容,因为只有 3 个词可以匹配。您一定使用过 .findall()
,它显式返回 strings,因此不匹配的模式组将表示为空字符串。
删除问号,直到您在逗号前添加所需的第 4 个单词,您的模式才会匹配您的输入示例:
>>> pattern_required = re.compile(r'(\b\w+\b)[^a-z]*(\b\w+\b)[^a-z]*(\b\w+\b)[^a-z]*(\b\w+\b)[,;]\s*(\b\w+\b)[^a-z]*(\b\w+\b)[^a-z]*(\b\w+\b)[^a-z]*(\b\w+\b)')
>>> pattern_required.findall(example)
[]
>>> pattern_required.findall('Not ' + example)
[('Not', 'waiting', 'for', 'coffee', 'waiting', 'for', 'coffee', 'and')]
如果您需要匹配 2 到 4 个单词,但不想要空组,则必须使一个组匹配多个单词。您不能拥有可变数量的组,正则表达式不能那样工作。
匹配一组中的多个单词:
>>> pattern_variable = re.compile(r'(\b\w+\b)[^a-z]*((?:\b\w+\b[^a-z]*){1,3})[,;]\s*(\b\w+\b)[^a-z]*(\b\w+\b)[^a-z]*(\b\w+\b)[^a-z]*(\b\w+\b)')
>>> pattern_variable.findall(example)
[('waiting', 'for coffee', 'waiting', 'for', 'coffee', 'and')]
>>> pattern_variable.findall('Not ' + example)
[('Not', 'waiting for coffee', 'waiting', 'for', 'coffee', 'and')]
此处 (?:...)
语法创建了一个非捕获组,该组不在 .findall()< 中产生输出
列表;在这里使用,所以我们可以在上面放一个量词。 {1,3}
告诉正则表达式我们希望前面的组匹配 1 到 3 次。
注意输出;第二组包含可变数量的单词(在 1 到 3 之间)。
关于python - Python 正则表达式评估期间的空分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17677439/