Python通过逗号和空格拆分字符串

5
我需要通过逗号和空格来分割一个字符串。期望的结果是将字符串' 5, 3, , hello'转换成列表['5', '3', 'hello']。以下是我的尝试:
import re
re.split(',|\s+', '    5,    3,   , hello')
['', '5', '', '3', '', '', '', 'hello']

为什么返回空条目?如何获取列表 ['5', '3', 'hello']

也许re.split('[\s,]+', s.strip()) => ['5', '3', 'hello'] - Wiktor Stribiżew
@WiktorStribiżew Closer函数返回['', '5', '3', 'hello'] - kilojoules
1
也许你可以在用逗号分割主字符串后,将所有的字符串都去掉? - Some Guy
实际上,他也想在此之后摆脱空字符串。类似于 [x for x in re.split(',?\s+', s) if x] - NickD
2个回答

12

您可以使用findall并匹配所需内容:

>>> print re.findall(r'[^,\s]+', '    5,    3,   , hello')
['5', '3', 'hello']

[^,\s]+使用取非字符类匹配任何不是逗号和空格的文本。


你的拆分正则表达式,|\s+会在多个位置进行拆分,因为,也被空格包围。

由于你的输入具有前导空格,即使在[,\s]+上进行拆分,也会在开头产生一个空元素。

>>> print re.split(r'[,\s]+', '    5,    3,   , hello')
['', '5', '3', 'hello']

1
谢谢。你能解释一下findall正则表达式吗? - kilojoules
1
当然。[^,\s]+使用否定字符类来匹配任何不是逗号和空格的文本。 - anubhava

6

仅供娱乐,展示非正则表达式的方法,您可以通过在列表推导中拆分,来执行此操作,并忽略任何通过isspace检查的字符串,并最终在放置在列表中的数据上调用strip以去除周围的空格。

考虑到这一点,最终解决方案如下:

>>> s = '    5,    3,   , hello'
>>> res = [c.strip() for c in s.split(',') if not c.isspace()]
>>> res
['5', '3', 'hello']

对这两种解决方案进行timeit分析后,我们可以观察到以下结果:

>>> print(timeit('''
... s = '    5,    3,   , hello'
... res = [c.strip() for c in s.split(',') if not c.isspace()]
... '''))
1.681301467004232
>>>
>>> print(timeit('''
... import re
... re.findall(r'[^,\s]+', '    5,    3,   , hello')
... '''))
2.7143720029853284

我有些惊讶于这种非正则表达式理解方法优势的巨大差异。


我认为如果你使用“map”而不是列表推导,这将会更快。 - Yaroslav Nikitenko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接