2012-09-13 100 views
7

我試圖找出一個簡單的函數來捕獲錯別字,如分裂字母和數字字符:固定後快速的方式在Python字符串

"Westminister15" 
"Westminister15London" 
"23Westminister15London" 

["Westminister", "15"] 
["Westminister", "15", "London"] 
["23", "Westminister", "15", "London"] 

第一次嘗試:

def fixate(query): 
    digit_pattern = re.compile(r'\D') 
    alpha_pattern = re.compile(r'\d') 
    digits = filter(None, digit_pattern.split(query)) 
    alphas = filter(None, alpha_pattern.split(query)) 
    print digits 
    print alphas 

結果:

fixate("Westminister15London") 

> ['15'] 
> ['Westminister', 'London'] 

不過,我認爲這可能是更有效地完成,我仍然很糟糕的結果,當我嘗試類似:

fixate("Westminister15London England") 

> ['15'] 
> ['Westminister', 'London England'] 

顯然應該爭取LondonEngland分開,但我覺得我的功能將得到過度修補和那裏有一個簡單的方法

這個問題有點相當於this PHP問題

回答

15

問題是Python的re.split()不發在零長度的比賽中得分。但是你可以用re.findall()得到期望的結果:

>>> re.findall(r"[^\W\d_]+|\d+", "23Westminister15London") 
['23', 'Westminister', '15', 'London'] 
>>> re.findall(r"[^\W\d_]+|\d+", "Westminister15London England") 
['Westminister', '15', 'London', 'England'] 

\d+匹配任何數量的數字,[^\W\d_]+任何單詞相匹配。

+0

Thanks @TimPietzcker that's great –

3

你可以使用這個表達式,而不是你的:

>>> import re 
>>> regex = re.compile(r'(\d+|\s+)') 
>>> regex.split('Westminister15') 
['Westminister', '15', ''] 
>>> regex.split('Westminister15London England') 
['Westminister', '15', 'London', ' ', 'England'] 
>>> 

然後,你必須過濾列表中刪除空字符串/白色空間隻字符串。

5

這裏的的情況下,另一種方法您更喜歡遠離正則表達式,這有時是笨拙的路程,如果一個不夠熟悉,使其/更改自己:

a = "Westminister15" 
b = "Westminister15London" 
c = "23Westminister15London" 
d = "Westminister15London England" 

def split_text(s): 
    from itertools import groupby 
    for k,g in groupby(s, str.isalpha): 
     yield ''.join(list(g)) 

print list(split_text(a)) 
print list(split_text(b)) 
print list(split_text(c)) 
print list(split_text(d)) 

回報:

['Westminister', '15'] 
['Westminister', '15', 'London'] 
['23', 'Westminister', '15', 'London'] 
['Westminister', '15', 'London', ' ', 'England'] 

生成器也可以很容易地修改,如果需要,永遠不會產生空白字符串。