如何使用Python分割该字符串?

8
我有类似下面的字符串: "AAABBBCDEEEEBBBAA"
在该字符串中,任何字符都可能出现。
我想把它分成一个列表,如下所示: ['AAA','BBB','C','D','EEEE','BBB','AA']
因此,相同字符的连续区域将被拆分为不同的列表元素。
我知道可以迭代字符串中的字符,检查每个 i 和 i-1对是否包含相同的字符,等等。但是,是否存在更简单的解决方案?
4个回答

15

我们可以使用正则表达式:

>>> import re
>>> r = re.compile(r'(.)\1*')
>>> [m.group() for m in r.finditer('AAABBBCDEEEEBBBAA')]
['AAA', 'BBB', 'C', 'D', 'EEEE', 'BBB', 'AA']

或者,我们可以使用itertools.groupby

>>> import itertools
>>> [''.join(g) for k, g in itertools.groupby('AAABBBCDEEEEBBBAA')]
['AAA', 'BBB', 'C', 'D', 'EEEE', 'BBB', 'AA']

timeit 显示正则表达式比字符串更快(针对此特定字符串)(Python 2.6Python 3.1)。但正则表达式毕竟是专门用于字符串的,而groupby是一个通用函数,所以这并不出乎意料。


哇,谢谢,正则表达式解决方案很棒,groupby也是,我怎么可能在将问题发送到stackoverflow并在5分钟内得到答案之前花了这么多时间呢;-) - jan

9
>>> from itertools import groupby
>>> [''.join(g) for k, g in groupby('AAAABBBCCD')]
['AAAA', 'BBB', 'CC', 'D']

通过常规的字符串操作
>>> a=[];S="";p=""
>>> s
'AAABBBCDEEEEBBBAA'
>>> for c in s:
...     if c != p: a.append(S);S=""
...     S=S+c
...     p=c
...
>>> a.append(S)
>>> a
['', 'AAA', 'BBB', 'C', 'D', 'EEEE', 'BBB', 'AA']
>>> filter(None,a)
['AAA', 'BBB', 'C', 'D', 'EEEE', 'BBB', 'AA']

3
import itertools
s = "AAABBBCDEEEEBBBAA"
["".join(chars) for _, chars in itertools.groupby(s)]

0

解决问题的另一种方式:

#!/usr/bin/python

string = 'AAABBBCDEEEEBBBAA'
memory = str()
List = list()
for index, element in enumerate(string):
    if index > 0:
        if string[index] == string[index - 1]:
            memory += string[index]
        else:
            List.append(memory)
            memory = element
    else:
        memory += element

print List

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接