在未指定的任何字符周围拆分字符串

时间:2012-11-19 21:30:38

标签: python regex string

我希望能够将字符串拆分为不是数字或点的任何内容。目前split方法只提供了一种做出积极匹配的方法,是正则表达式在这种情况下采取的最佳途径吗?

例如,给定字符串"10.23, 10.13.21; 10.1 10.5 and 10.23.32" 这应该返回列表['10.23', '10.13.21', '10.1', '10.5', '10.23.32']

因此我相信在这种情况下使用的最好的正则表达式将是...... [\d\.]+

这是处理此类案件的最佳方法吗?

3 个答案:

答案 0 :(得分:9)

如果您考虑re.findall:您可以将re.split与正则表达式的反转版本一起使用:

In [1]: import re

In [2]: s = "10.23, 10.13.21; 10.1 10.5 and 10.23.32"

In [3]: re.split(r'[^\d\.]+', s)
Out[3]: ['10.23', '10.13.21', '10.1', '10.5', '10.23.32']

答案 1 :(得分:2)

如果您需要除正则表达式之外的其他解决方案,可以使用str.translate并将'.0123456789'以外的所有内容翻译为空白并调用split()

In [69]: mystr
Out[69]: '10.23, 10.13.21; 10.1 10.5 and 10.23.32'

In [70]: mystr.translate(' '*46 + '. ' + '0123456789' + ' '*198).split()
Out[70]: ['10.23', '10.13.21', '10.1', '10.5', '10.23.32']

希望这有帮助

答案 2 :(得分:2)

@ inspectorG4dget提出的可读性更好的形式:

>>> import string
>>> s = '10.23, 10.13.21; 10.1 10.5 and 10.23.32'
>>> ''.join(c if c in set(string.digits + '.') else ' ' for c in s).split()
['10.23', '10.13.21', '10.1', '10.5', '10.23.32']

通过这种方式,您可以避免使用正则表达式,这在您很容易就能做到的时候通常是个好主意。