试图了解python中的正则表达式示例,这是我的代码
line='bar asdfgh klmn, foo'
print(re.split(r'(;|,|\s)\s*',line))
#output is ['bar', ' ', 'asdfgh', ' ', 'klmn', ',', 'foo']
在输出中显示了字符串和分隔符,最后一个分隔符是带有五个空格的逗号,而不仅仅是逗号
如果分隔符只是逗号,那么输出不应该是这样吗?
#output ['bar', ' ', 'asdfgh', ' ', 'klmn', ',', ' foo']
答案 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']
当前模式的问题是,如果存在逗号/分号分隔符,则它留有可选的空间。这导致空格显示为匹配的词。