具有重复组的正则表达式

时间:2015-05-07 09:34:36

标签: python regex

我一直试图匹配连字符之间的短语。我意识到我可以很容易地分开连字符并删除短语,但我的等效正则表达式没有按预期工作,我想了解原因:

([^-,]+(?:(?: - )|$))+

[^-,]+只是我对短语的定义

(?: - )只是非捕获空格分隔的连字符

所以(?:(?: - )|$)正在捕捉连字符或行尾

最后,括号中包含+量词的整个事物与多个匹配。

如果我执行regex.match("A - B - C").groups(),我得到的是('C',)

我还尝试了更简单的正则表达式([^,-]+)+,结果类似

我正在使用re.match,因为我想使用pandas.Series.str.extract将其应用到很长的列表中。

重申:我现在在连字符上使用简单split,但为什么这个正则表达式不会返回多个组?

由于

1 个答案:

答案 0 :(得分:3)

正则表达式捕获组通过它们在表达式中的外观进行静态“命名”。每个捕获组都有自己的编号,并且无论单个组捕获的内容多少,都会将匹配分配给该组。

如果某个组之前捕获了某些内容,之后再次捕获,则后面的结果会覆盖之前捕获的内容。无法使用正常匹配收集所有组的捕获值。

如果要查找多个值,则只需要匹配一个组,并在字符串的其余部分重复匹配。这通常由re.findallre.finditer完成:

>>> re.findall('\s*([^-,]+?)\s*', 'A - B - C')
['A', 'B', 'C']