python - Python 正则表达式评估期间的空分组

标签 python regex

学习 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/

相关文章:

python - 在 matplotlib 中启用 sharex 时自定义刻度标签

ios - NSRegularExpression 找不到捕获组匹配项

javascript - 正则表达式匹配不输出相邻匹配javascript

Python - 如果键等于值,则从列表中删除字典

JavaScript - 从字符串中删除 Minecraft 颜色代码

java - Grails:拆分包含管道的字符串

regex - 路由 http 请求时奇怪的 Go 正则表达式不匹配

python - += 在 Python 中是什么意思?

python - 使用哪个命令来检查 python 是 64 位还是 32 位

python - 尝试清理安装 python (anaconda),出现与先前安装相关的错误