为什么 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() ...
)。
我正在尝试在保留分隔符的同时,在空格和标点符号等所有特殊字符处拆分输入的文本。我的 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() ...
)。