2012-09-13 64 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'] 

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