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

vaqhlq81  于 2023-01-14  发布在  Python
关注(0)|答案(3)|浏览(164)

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

"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问题

ctehm74n

ctehm74n1#

使用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_]+匹配任意单词。
re.split()在当前的Python版本中也是可能的,因为现在支持对零长度匹配进行拆分,但是得到的正则表达式要复杂得多,所以我仍然推荐旧的方法。

eqoofvh9

eqoofvh92#

如果你不想使用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']

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

dddzy1tm

dddzy1tm3#

您可以使用以下正则表达式代替您的正则表达式:

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

然后,您必须过滤列表,删除空字符串/仅包含空格的字符串。

相关问题