4

我希望能够将一个字符串拆分成一个列表,围绕任何不是数字或点的东西。目前 split 方法只提供了一种对 split 进行肯定匹配的方法,正则表达式是在这种情况下采用的最佳途径吗?

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

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

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

4

3 回答 3

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']
于 2012-11-19T21:33:24.487 回答
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']

希望这可以帮助

于 2012-11-19T21:36:21.477 回答
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']

通过这种方式,您可以避免使用正则表达式,这通常是一个好主意,因为您可以很容易地做到这一点。

于 2012-11-19T22:04:38.753 回答