从字符串中的数字拆分字母

时间:2013-03-22 14:09:14

标签: python string split

我正在处理这样的字符串:"125A12C15" 我需要在字母和数字之间的边界处将它们分开,例如这个应该成为["125","A","12","C","15"]

在Python中执行此操作是否有更优雅的方法,而不是通过位置逐行检查并检查它是字母还是数字,然后相应地连接?例如。这种东西的内置功能或模块?

感谢您的任何指示!

1 个答案:

答案 0 :(得分:28)

itertools.groupbystr.isalpha方法结合使用:

  

文档字符串:

     

groupby(iterable [,keyfunc]) - >创建一个返回的迭代器   (键,子迭代器)按键(值)的每个值分组。


  

文档字符串:

     

S.isalpha() - >布尔

     

如果S中的所有字符都是字母,则返回True   S中至少有一个字符,否则为False。


In [1]: from itertools import groupby

In [2]: s = "125A12C15"

In [3]: [''.join(g) for _, g in groupby(s, str.isalpha)]
Out[3]: ['125', 'A', '12', 'C', '15']

regular expressions module中的re.findallre.split

In [4]: import re

In [5]: re.findall('\d+|\D+', s)
Out[5]: ['125', 'A', '12', 'C', '15']

In [6]: re.split('(\d+)', s)  # note that you may have to filter out the empty
                              # strings at the start/end if using re.split
Out[6]: ['', '125', 'A', '12', 'C', '15', '']

In [7]: re.split('(\D+)', s)
Out[7]: ['125', 'A', '12', 'C', '15']

至于性能,似乎使用正则表达式可能更快:

In [8]: %timeit re.findall('\d+|\D+', s*1000)
100 loops, best of 3: 2.15 ms per loop

In [9]: %timeit [''.join(g) for _, g in groupby(s*1000, str.isalpha)]
100 loops, best of 3: 8.5 ms per loop

In [10]: %timeit re.split('(\d+)', s*1000)
1000 loops, best of 3: 1.43 ms per loop