在python字符串中快速拆分字母和数字字符的方法

2024-04-19 12:16:32 发布

您现在位置: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,但是我觉得我的函数会被过度修补,有一个更简单的方法

这个问题在某种程度上相当于thisphp问题


Tags: 函数alpharenonefilterquerypatterncompile
3条回答

下面是另一种方法,以防您更喜欢远离regex,如果您对regex不够熟悉而无法自己进行修改,那么regex有时可能会很难使用:

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

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

你可以用这个正则表达式代替你的正则表达式:

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

然后,您必须过滤列表以删除空字符串/仅空白字符串。

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

相关问题 更多 >