为什么 Python re 不拆分多个标点符号实例?

Why is Python re not splitting multiple instances of punctuation?

我正在尝试在保留分隔符的同时,在空格和标点符号等所有特殊字符处拆分输入的文本。我的 re 模式完全按照我想要的方式工作,只是它不会拆分标点符号的多个实例。 这是我的重新模式 wordsWithPunc = re.split(r'([^-\w]+)',words)

如果我有一个像“你好”这样的词,它后面有两个标点符号,那么这些标点符号会被拆分,但它们仍然是同一个元素。例如 "hello,-" 将等于 "hello",",-" 但我希望它是 "hello",",","-"

另一个例子。 My name is mud!!! 会被分成 "My","name","is","mud","!!!" 但我希望它是 "My","name","is","mud","!","!","!"

如果您想捕获单个非单词字符,您需要使您的模式非贪婪(删除 +),例如:

import re

words = 'My name is mud!!!'
splitted = re.split(r'([^-\w])', words)
# ['My', ' ', 'name', ' ', 'is', ' ', 'mud', '!', '', '!', '', '!', '']

这也会在非单词字符之间产生 'empty' 匹配(因为你对每个字符都进行了分割),但你可以通过对结果进行后处理以删除空匹配来缓解这种情况:

splitted = [match for match in re.split(r'([^-\w])', words) if match]
# ['My', ' ', 'name', ' ', 'is', ' ', 'mud', '!', '!', '!']

如果您还想摆脱 space 匹配项,您可以进一步去除生成器中的 spaces(即 ... if match.strip() ...)。