快速的方式在Python字符串分割字母和数字字符

问题描述 投票:13回答:3

我试图找出一个简单的函数来捕捉错别字,e.g:

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

显然,这应该争取London并分别England,但我觉得我的功能将得到过度修补和那里有一个简单的方法

这个问题是有点相当于this PHP的问题

python regex
3个回答
19
投票

问题是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_]+任何单词相匹配。


8
投票

这里的情况下,你更愿意留从正则表达式,这有时是笨拙的路程,如果一个不够熟悉,使其另一个方法/更改自己:

from itertools import groupby

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

print(list(split_text("Westminister15")))
print(list(split_text("Westminister15London")))
print(list(split_text("23Westminister15London")))
print(list(split_text("Westminister15London England")))

收益:

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

发电机可以被容易地修改,同样,如果需要的话,以从未得到空格的字符串。


3
投票

你可以使用这个表达式,而不是你的:

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

然后,你必须过滤列表中删除空字符串/白色空间只字符串。

© www.soinside.com 2019 - 2024. All rights reserved.