每次遇到标点符号或数字时,我都会尝试拆分字符串,例如:
toSplit = 'I2eat!Apples22becauseilike?Them'
result = re.sub('[0123456789,.?:;~!@#$%^&*()]', ' \1',toSplit).split()
所需的输出将是:
['I', '2', 'eat', '!', 'Apples', '22', 'becauseilike', '?', 'Them']
但是,上面的代码(尽管它正确地分割了应该在的位置)删除了所有数字和标点符号。
任何澄清将不胜感激。
答案 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']