2012-11-19 69 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'] 

這樣就可以避免正則表達式,這往往是一個好主意,當你可以相當容易地。