有文本 如: '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']
2 回答5.1k 阅读✓ 已解决
2 回答1.1k 阅读✓ 已解决
4 回答972 阅读✓ 已解决
3 回答1.1k 阅读✓ 已解决
3 回答1.2k 阅读✓ 已解决
1 回答1.7k 阅读✓ 已解决
1 回答1.2k 阅读✓ 已解决