2012-11-19 34 views
4

我期望能够将字符串拆分为任何不是数字或点的列表。目前的分裂方法只提供了一个正确匹配的方式来分裂,是一个正则表达式在这种情况下采取的最佳途径?围绕任何未指定字符拆分字符串

例如,给定字符串"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\.]+

这是最好的方法处理这种情况?

+1

我同意一个正则表达式似乎是在这种情况下最适合的。 – BoppreH

回答

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'] 
+0

谢谢!这正是我所寻找的,我不介意使用正则表达式,它只是一个额外的复杂程度来获得匹配,然后建立我自己的列表,这是我想避免的,所以这是完美的。 – EEP

2

如果你想比正则表达式其他的解决方案,你可以使用str.translate和翻译比'.'其他一切成空白做出split()

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

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

希望呼叫这有助于

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'] 

这样就可以避免正则表达式,这往往是一个好主意,当你可以相当容易地。