如何在python中拆分具有多个分隔符的字符串? [复制]

Posted

技术标签:

【中文标题】如何在python中拆分具有多个分隔符的字符串? [复制]【英文标题】:How to split a string with many delimiter in python? [duplicate] 【发布时间】:2018-12-23 06:24:11 【问题描述】:

我想通过删除所有字母字符来拆分字符串。

默认情况下,split 仅在单词之间按空格分隔。但我想按字母字符的所有内容进行拆分。如何在split 中添加多个分隔符?

例如:

word1 = input().lower().split() 
# if you input " has 15 science@and^engineering--departments, affiliated centers, Bandar Abbas&&and Mahshahr."
#the result will be ['has', '15', 'science@and^engineering--departments,', 'affiliated', 'centers,', 'bandar', 'abbas&&and', 'mahshahr.']

但我正在寻找这种结果:

['has', '15', 'science', 'and', 'engineering', 'departments', 'affiliated', 'centers', 'bandar', 'abbas', 'and', 'mahshahr']

【问题讨论】:

还有***.com/questions/1059559/… 你可以做import rewords = re.findall(r"\w+", input().lower()) @jonrsharpe,我认为这是一个不同的问题。我相信 OP 正试图按所有字母数字字符进行拆分。不仅按选定字符拆分。可能还有另一个副本,但我找不到。 @jpp,如果问题是在字母数字上 split,结果中不会有非字母数字字符吗?似乎在多个分隔符上拆分是重复的,无论使用哪一组分隔符进行拆分 - 正则表达式解决方案的唯一区别是使用的模式。 @wwii,请参阅我的回答,似乎解决了问题,而无需回答建议的副本。尽管每个人似乎都更喜欢正则表达式。可能这个问题需要更清楚,但它不清楚/太宽泛,而不是一个重复。 【参考方案1】:

为了提高性能,您应该按照标记的副本使用正则表达式。请参阅下面的基准测试。

groupby + str.isalnum

您可以使用itertools.groupbystr.isalnum 按字母数字字符进行分组。

使用此解决方案,您不必担心被明确指定的字符分割。

from itertools import groupby

x = " has 15 science@and^engineering--departments, affiliated centers, Bandar Abbas&&and Mahshahr."

res = [''.join(j) for i, j in groupby(x, key=str.isalnum) if i]

print(res)

['has', '15', 'science', 'and', 'engineering', 'departments',
 'affiliated', 'centers', 'Bandar', 'Abbas', 'and', 'Mahshahr']

基准测试与正则表达式

一些性能基准测试与正则表达式解决方案(在 Python 3.6.5 上测试):

from itertools import groupby
import re

x = " has 15 science@and^engineering--departments, affiliated centers, Bandar Abbas&&and Mahshahr."

z = x*10000
%timeit [''.join(j) for i, j in groupby(z, key=str.isalnum) if i]  # 184 ms
%timeit list(filter(None, re.sub(r'\W+', ',', z).split(',')))      # 82.1 ms
%timeit list(filter(None, re.split('\W+', z)))                     # 63.6 ms
%timeit [_ for _ in re.split(r'\W', z) if _]                       # 62.9 ms

【讨论】:

如果我们也想删除数字怎么办? 可能是str.isalpha【参考方案2】:

您可以将所有非字母数字字符替换为单个字符(我使用的是逗号)

s = 'has15science@and^engineering--departments,affiliatedcenters,bandarabbas&&andmahshahr.'

alphanumeric = re.sub(r'\W+', ',',s) 

然后用逗号分割:

splitted = alphanumeric.split(',')

编辑:

正如@DeepSpace 所建议的,这可以在一条语句中完成:

splitted = re.split('\W+', s)

【讨论】:

或者干脆使用re.split @DeepSpace,谢谢,更新了我的答案:)

以上是关于如何在python中拆分具有多个分隔符的字符串? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

在Python中拆分具有未知数量空格的字符串作为分隔符

如何拆分具有多个分隔符powershell的字符串?

拆分具有多个分隔符的字符串并将其保存到向量中

在Python中使用多个分隔符拆分字符串[重复]

将字符串拆分为具有多个分隔符的多个字符串而不删除?

4-1如何拆分含有多个分隔符的字符串