在Python中按标点或数字拆分字符串

时间:2019-08-14 12:26:09

标签: python regex split numbers punctuation

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

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

所需的输出将是:

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

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

任何澄清将不胜感激。

3 个答案:

答案 0 :(得分:3)

对捕获组使用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']

答案 1 :(得分:1)

您可以使用以下类似的方式将字符串标记化为数字,字母和其他非空格字符:字母,数字和

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

答案 2 :(得分:0)

使用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']