我希望能够将字符串拆分为不是数字或点的任何内容。目前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\.]+
这是处理此类案件的最佳方法吗?
答案 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']
通过这种方式,您可以避免使用正则表达式,这在您很容易就能做到的时候通常是个好主意。