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

为什么Python不拆分多个标点符号实例?,python,split,re,punctuation,Python,Split,Re,Punctuation,我试图在保留分隔符的同时,在空格和所有特殊字符(如标点符号)处拆分输入的文本。我的重模式完全按照我想要的方式工作,只是它不会分割标点符号的多个实例。 这是我的re模式wordsWithPunc=re.split(r'([^-\w]+),words) 如果我有一个像“hello”这样的单词,后面有两个标点符号,那么这些标点符号将被拆分,但它们仍然是相同的元素。例如 “hello,”将等于“hello”、“,-”,但我希望它是“hello”、“,”、“-” 另一个例子。我的名字是mud将被分为“我的

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

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


另一个例子。
我的名字是mud
将被分为
“我的”、“名字”、“是”、“泥”和“!!!”
但我希望它是
“我的”、“名字”、“是”、“泥”和“!”、“!”、“!”、“!”
如果您想捕获单个非单词字符,您需要使您的模式不贪婪(删除
+
),例如:

import re

words = 'My name is mud!!!'
splitted = re.split(r'([^-\w])', words)
# ['My', ' ', 'name', ' ', 'is', ' ', 'mud', '!', '', '!', '', '!', '']
这也会在非单词字符之间产生“空”匹配(因为您正在对每个字符进行切分),但您可以通过对结果进行后处理以删除空匹配来减轻这种情况:

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

如果您还想删除空间匹配项,可以进一步删除生成器中的空格(即,
…if match.strip()…
)!多亏了一个bunchis有一种方法我可以使用
splitted=[match for match in re.split(r'(^-\w]),words)if match]
来摆脱新行,并在一行中有两行或更多行时返回?@monstermatt如果你想去除空格和换行符,就像我在最后建议的那样,可以执行类似的操作:
splitted=[match for match in re.split(r'([^-\w]),words)if match.strip()]
。如果您需要执行更复杂的逻辑(例如,比较一行中的两个匹配,这需要跟踪最后一个匹配),我建议您编写一个单独的
compare
函数来执行此操作(以及在此过程中进行的任何其他匹配比较)然后只调用它而不是简单的布尔匹配,例如:
splitted=[match for match in re.split(r'([^-\w]),words)if compare(match)]