Python 中的标点符号或数字拆分字符串

Split string on punctuation or number in Python

每次遇到标点符号或数字时,我都会尝试拆分字符串,例如:

toSplit = 'I2eat!Apples22becauseilike?Them'
result = re.sub('[0123456789,.?:;~!@#$%^&*()]', ' ',toSplit).split()

所需的输出将是:

['I', '2', 'eat', '!', 'Apples', '22', 'becauseilike', '?', 'Them']

但是,上面的代码(尽管它在应该的地方正确拆分)删除了所有数字和标点符号。

任何澄清将不胜感激。

re.split 与捕获组一起使用:

toSplit = 'I2eat!Apples22becauseilike?Them'
result = re.split('([0-9,.?:;~!@#$%^&*()])', toSplit)
result

输出:

['I', '2', 'eat', '!', 'Apples', '2', '', '2', 'becauseilike', '?', 'Them']

如果要拆分重复的数字或标点符号,请添加+:

result = re.split('([0-9,.?:;~!@#$%^&*()]+)', toSplit)
result

输出:

['I', '2', 'eat', '!', 'Apples', '22', 'becauseilike', '?', 'Them']

您可以使用

将字符串标记为数字、字母和其他非空格、字母和数字的字符
re.findall(r'\d+|(?:[^\w\s]|_)+|[^\W\d_]+', toSplit)

这里,

  • \d+ - 1+ 位数
  • (?:[^\w\s]|_)+ - 除了单词和空格字符或 _
  • 以外的 1+ 个字符
  • [^\W\d_]+ - 任何 1+ 个 Unicode 字母。

参见regex demo

匹配方法比拆分更灵活,因为它还允许对复杂结构进行标记。比如说,您还想标记十进制(浮点数、双精度...)数字。您只需要使用 \d+(?:\.\d+)? 而不是 \d+:

re.findall(r'\d+(?:\.\d+)?|(?:[^\w\s]|_)+|[^\W\d_]+', toSplit) 
             ^^^^^^^^^^^^^

参见 this regex demo

使用 re.split 在找到字母表范围时拆分

>>> import re                                                              
>>> re.split(r'([A-Za-z]+)', toSplit)                                      
['', 'I', '2', 'eat', '!', 'Apples', '22', 'becauseilike', '?', 'Them', '']
>>>                                                                        
>>> ' '.join(re.split(r'([A-Za-z]+)', toSplit)).split()                    
['I', '2', 'eat', '!', 'Apples', '22', 'becauseilike', '?', 'Them']