2012-03-22 44 views
3

我使用正則表達式[,; \ s] +來分隔逗號,空格或分號分隔的字符串。使用正則表達式分割逗號,空格或分號分隔字符串

>>> p=re.compile('[,;\s]+') 
>>> mystring='a,,b,c' 
>>> p.split(mystring) 
['a', 'b', 'c'] 

當字符串有在最後一個逗號:如果字符串沒有在最後一個逗號也能正常工作

>>> mystring='a,,b,c,' 
>>> p.split(mystring) 
['a', 'b', 'c', ''] 

我想在這種情況下,輸出爲[ 'a','b','c']。

對正則表達式的任何建議?

+2

是這對於一個csv – John 2012-03-22 01:07:54

+0

@johnthexiii都能跟得上 – ghostcoder 2012-03-22 01:09:12

回答

5

嘗試:

str = 'a,,b,c,' 
re.findall(r'[^,;\s]+', str) 
+0

謝謝Qtax。這工作 – ghostcoder 2012-03-22 17:46:41

7

這裏的東西非常的低技術應該仍然工作:

mystring='a,,b,c' 
for delim in ',;': 
    mystring = mystring.replace(delim, ' ') 
results = mystring.split() 

PS: 雖然正則表達式是非常有用的,我會強烈建議它是否是在這裏工作的工具三思而後行。雖然我不確定編譯正則表達式的確切運行時間是多少(我最多隻想到O(n^2)),但它肯定不會比O(n)快,這是string.replace的運行時間。因此,除非有您需要使用正則表達式不同的原因,你應該用這種解決方案設置

+0

感謝inspectorG4dget爲PS。 – ghostcoder 2012-03-22 17:47:31

3

那麼,分裂技術上工作。在a,,b,c中,它在,,,上分開,留下「a」,「b」和「c」。在a,,b,c,,它分裂在,,,,和最後,(因爲它們都匹配正則表達式!)。這些分隔符周圍的字符串是「a」,「b」,「c」和「」(在最後一個逗號和字符串結尾之間)。

有幾種方法可以規避這一點。如果有在開始或結束的字符串分隔符使用str.strip只會發生

  • 空字符串,所以剪掉這些[,;\s]到分割之前的:

    p.split(mystring.strip(',; \t\r\n')) 
    
  • 取出空拆分後的字符串,使用任何方法,你請

    res = p.split(mystring) 
    [r for r in res if r != ''] 
    # another option 
    filter(None,res) 
    
  • 更妙的是,因爲你知道你只能得到電子作爲拆分字符串的第一部分或最後一部分的空字符串(例如, ,a,b,ca,b,c,),不通過整個分裂迭代:

    res = p.slit(mystring) 
    # this one relies on coercing logical to numbers: 
    # if res[0] is '' it'll be 1:X, otherwise it'll be 0:X, 
    # where X is len(res) if res[-1] is not '', and len(res)-1 otherwise. 
    res[ res[0]=='':(len(res)-(res[-1]==''))] 
    
+0

感謝您的詳細解釋。 – ghostcoder 2012-03-22 17:46:26

相關問題