Python 分割文本使得 字母和数字 分开?

有文本 如: '3a4b5cdd7e'
如何得到: '3' 'a' 4' 'b' '5' 'cdd' '7' 'e'
尽量不使用正则

阅读 35.2k
5 个回答
from itertools import groupby

s = '3a4b5cdd7e'
print [''.join(list(g)) for k, g in groupby(s, key=lambda x: x.isdigit())]

用正则不是很简单吗?

>>> 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的字符串:

clipboard.png

处理长度为10的字符串:

clipboard.png

明显可以看出无论字符长短正则速度完胜,处理10W长度字符串时比最慢的groupby方法快了近5倍,所以你为啥不用正则?

PS:自己写的一坨代码速度居然比groupby快,想想都有点小激动呢。

python有个isdigit函数,可以判断字符串是否是纯数字,你把那串字符一个个字符遍历就行了

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']
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题