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']
每次遇到标点符号或数字时,我都会尝试拆分字符串,例如:
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']