有文本 如: '3a4b5cdd7e'
如何得到: '3' 'a' 4' 'b' '5' 'cdd' '7' 'e'
尽量不使用正则
用正则不是很简单吗?
>>> import re
>>> s='3a4b5cdd7e'
>>> re.findall(r'[0-9]+|[a-z]+',s)
['3', 'a', '4', 'b', '5', 'cdd', '7', 'e']
我写了个不用groupby也不用re正则的
from itertools import groupby
import re
def exp_str(s):
"""只用标准库函数"""
s += s[-2]
p = 0
for index, item in enumerate(s):
try:
n = index + 1
sn = s[n]
except IndexError:
_ = s[p: index]
if _:
yield _
if item.isdigit() and sn.isdigit():
continue
elif item.isalpha() and sn.isalpha():
continue
else:
yield s[p: n]
p = index + 1
def use_group(s):
"""这是用groupby的情况"""
return [''.join(list(g)) for k, g in groupby(s, key=lambda x: x.isdigit())]
def use_re(s):
"""这是用正则表达式的情况"""
return re.findall(r'[0-9]+|[a-z]+', s)
然后顺路跑了个分,如图
处理长度为10W的字符串:
处理长度为10的字符串:
明显可以看出无论字符长短正则速度完胜,处理10W长度字符串时比最慢的groupby方法快了近5倍,所以你为啥不用正则?
PS:自己写的一坨代码速度居然比groupby快,想想都有点小激动呢。
python3
>>> from itertools import groupby
>>> s='3a4b5cdd7e'
>>> [''.join(g) for _, g in groupby(s, key=lambda x: x.isdigit()*'d' or x.isalpha()*'a' )]
['3', 'a', '4', 'b', '5', 'cdd', '7', 'e']
4 回答968 阅读
1 回答696 阅读
1 回答691 阅读
1 回答526 阅读
642 阅读
584 阅读
563 阅读