Python 带重复组的正则表达式
我一直在尝试在连字符之间匹配一个短语。我意识到,我可以很容易地在连字符上拆分并取出短语,但我的等效正则表达式没有按预期工作,我想了解原因:Python 带重复组的正则表达式,python,regex,Python,Regex,我一直在尝试在连字符之间匹配一个短语。我意识到,我可以很容易地在连字符上拆分并取出短语,但我的等效正则表达式没有按预期工作,我想了解原因: ([^-,]+(?:(?:-)|$)+ [^-,]+只是我对一个短语的定义 (?:-)只是非捕获空格分隔的连字符 因此,(?:(?:-)|$)正在捕获连字符或行尾 最后,用+量词括起来的整件事匹配多个量词 如果我执行regex.match(“A-B-C”).groups()得到的是('C',) 我还尝试了更简单的正则表达式([^,-]+)+,结果类似 我使用
([^-,]+(?:(?:-)|$)+
[^-,]+
只是我对一个短语的定义
(?:-)
只是非捕获空格分隔的连字符
因此,(?:(?:-)|$)
正在捕获连字符或行尾
最后,用+
量词括起来的整件事匹配多个量词
如果我执行regex.match(“A-B-C”).groups()
得到的是('C',)
我还尝试了更简单的正则表达式([^,-]+)+
,结果类似
我使用re.match
是因为我想使用pandas.Series.str.extract
将其应用于一个很长的列表
重申一下:我现在在一个连字符上使用了一个简单的split
,但是为什么这个正则表达式不返回多个组呢
感谢正则表达式捕获组通过其在表达式中的外观静态地“命名”。每个捕获组都有自己的编号,并且无论单个组捕获某物的频率如何,都会将匹配项分配给该组 如果一个组在之前捕获了某个内容,之后又再次捕获,则稍后的结果将覆盖之前捕获的内容。使用普通匹配无法收集组的所有捕获值 如果要查找多个值,则只需匹配单个组,并对字符串的其余部分重复匹配。这通常由
re.findall
或re.finditer
完成:
>>> re.findall('\s*([^-,]+?)\s*', 'A - B - C')
['A', 'B', 'C']
我得到的是
('C',)
,而不是('A',)
。Per“重复捕获组将只捕获最后一次迭代。在重复组周围放置一个捕获组以捕获所有迭代,或者如果您对数据不感兴趣,则使用非捕获组”抱歉,是的,我也得到了C。问题编辑我不知道。谢谢,这很有道理!