【问题标题】:How to split this string with python?如何用python分割这个字符串?
【发布时间】:2010-10-15 08:44:14
【问题描述】:

我的字符串看起来像这个例子: "AAABBBCDEEEEBBBAA"

字符串中可以有任何字符。

我想将其拆分为如下列表: ['AAA','BBB','C','D','EEEE','BBB','AA']

因此,相同字符的每个连续延伸都会转到拆分列表的单独元素。

我知道我可以遍历字符串中的字符,检查每个 i 和 i-1 对是否包含相同的字符等,但有没有更简单的解决方案?

【问题讨论】:

    标签: python string split


    【解决方案1】:

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

    >>> 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)。但是Regex毕竟是专门针对字符串的,而groupby是一个泛型函数,所以这并不意外。

    【讨论】:

    • 哇,谢谢,正则表达式解决方案很酷,groupby 也是,我怎么可能在将问题发送到 stackoverflow 并在 5 分钟内得到答案之前花费这么多时间在这个问题上 ;-)
    【解决方案2】:
    >>> 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)]
      

      【讨论】:

        【解决方案4】:

        解决问题的另一种方法:

        #!/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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-12-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-05-15
          • 1970-01-01
          • 2021-06-12
          相关资源
          最近更新 更多