我试图找出一个简单的函数来捕获拼写错误,例如:
"Westminister15"
"Westminister15London"
"23Westminister15London"
Run Code Online (Sandbox Code Playgroud)
固定后:
["Westminister", "15"]
["Westminister", "15", "London"]
["23", "Westminister", "15", "London"]
Run Code Online (Sandbox Code Playgroud)
第一次尝试:
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
Run Code Online (Sandbox Code Playgroud)
结果:
fixate("Westminister15London")
> ['15']
> ['Westminister', 'London']
Run Code Online (Sandbox Code Playgroud)
但是,我认为这可以更有效地完成,当我尝试这样的事情时,我仍然会得到不好的结果:
fixate("Westminister15London England")
> ['15']
> ['Westminister', 'London England']
Run Code Online (Sandbox Code Playgroud)
显然它应该入伍London和England分开,但我觉得我的功能会得到过度修补,而且这是一种更简单的方法
这个问题有点像这个 php问题
Tim*_*ker 21
问题是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']
Run Code Online (Sandbox Code Playgroud)
\d+匹配任意数字的数字,[^\W\d_]+匹配任何单词.
这是另一种方法,如果你更喜欢远离正则表达式,如果一个人不熟悉它/自己改变它,有时可能会很笨拙:
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")))
Run Code Online (Sandbox Code Playgroud)
收益:
['Westminister', '15']
['Westminister', '15', 'London']
['23', 'Westminister', '15', 'London']
['Westminister', '15', 'London', ' ', 'England']
Run Code Online (Sandbox Code Playgroud)
如果需要,也可以容易地修改生成器,从而不会产生空白字符串.
您可以使用此正则表达式代替您的:
>>> import re
>>> regex = re.compile(r'(\d+|\s+)')
>>> regex.split('Westminister15')
['Westminister', '15', '']
>>> regex.split('Westminister15London England')
['Westminister', '15', 'London', ' ', 'England']
>>>
Run Code Online (Sandbox Code Playgroud)
然后您必须过滤列表,删除空字符串/仅空白字符串。