Python正则表达式捕获组拆分问题

时间:2019-01-29 01:25:41

标签: python regex

试图了解python中的正则表达式示例,这是我的代码

line='bar asdfgh klmn,     foo'
print(re.split(r'(;|,|\s)\s*',line))
#output is ['bar', ' ', 'asdfgh', ' ', 'klmn', ',', 'foo']

在输出中显示了字符串和分隔符,最后一个分隔符是带有五个空格的逗号,而不仅仅是逗号

如果分隔符只是逗号,那么输出不应该是这样吗?

#output ['bar', ' ', 'asdfgh', ' ', 'klmn', ',', '     foo']

3 个答案:

答案 0 :(得分:2)

re.split按模式分割提供的字符串,并返回括号中捕获的内容作为结果的一部分。

在这种情况下,您的正则表达式匹配“分号,逗号或空格字符(已捕获并返回),后跟0个或多个空格字符(已丢弃)”。结果,当逗号匹配时,示例中逗号后的空白将被占用,并且在输出中不存在。

答案 1 :(得分:2)

如果正则表达式中使用了捕获组,则re.split包括捕获组的内容。但是,它仍将整个匹配项用作分隔符,从而导致您观察到的行为。如果您希望"".join(split_results)与原始字符串相等,则需要捕获整个分隔符(并在现在有括号的地方使用非捕获的括号:r'((?:;|,|\s)\s*)')。

答案 2 :(得分:1)

我建议按以下模式分割:

\s*[,;]?\s+

这表示在可选的空格和逗号或分号分隔符上进行分割,然后是一个或多个空格。

line='bar asdfgh klmn,     foo'
print(re.split(r'\s*[,;]?\s+', line))

['bar', 'asdfgh', 'klmn', 'foo']

当前模式的问题是,如果存在逗号/分号分隔符,则它留有可选的空间。这导致空格显示为匹配的词。