【问题标题】:Regex with repeating groups带有重复组的正则表达式
【发布时间】:2015-05-07 09:34:36
【问题描述】:

我一直在尝试匹配连字符之间的短语。我意识到我可以轻松地拆分连字符并取出短语,但我的等效正则表达式没有按预期工作,我想了解原因:

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

[^-,]+只是我对一个词组的定义

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

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

最后,用+ 量词括在括号中的整个内容匹配多个。

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

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

我使用re.match 是因为我想使用pandas.Series.str.extract 将其应用于很长的列表。

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

谢谢

【问题讨论】:

  • 我得到的是('C',),而不是('A',)。根据this demo “重复捕获组将仅捕获最后一次迭代。如果您对数据不感兴趣,请在重复组周围放置一个捕获组以捕获所有迭代或使用非捕获组”
  • 对不起,是的,我也得到了 C。问题已编辑

标签: python regex


【解决方案1】:

正则表达式捕获组通过它们在表达式中的出现来静态“命名”。每个捕获组都有自己的编号,并且无论单个组捕获某物的频率如何,都会将匹配项分配给该组。

如果一个组之前捕获了某样东西,后来又再次捕获了,那么后面的结果将覆盖之前捕获的结果。无法使用普通匹配收集所有组的捕获值。

如果你想找到多个值,你只需要匹配一个组,然后对字符串的其余部分重复匹配。这通常由re.findallre.finditer 完成:

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

【讨论】:

  • 我不知道。谢谢,有道理!
猜你喜欢
  • 2012-11-20
  • 2016-09-22
  • 1970-01-01
  • 2010-12-31
  • 1970-01-01
  • 1970-01-01
  • 2020-11-26
  • 2013-03-26
  • 2022-01-22
相关资源
最近更新 更多