【问题标题】:Splitting a string with repeated characters into a list将具有重复字符的字符串拆分为列表
【发布时间】:2014-05-17 22:55:10
【问题描述】:

我对正则表达式的经验并不丰富,但我已经阅读了很多关于它的内容。假设有一个字符串s = '111234' 我想要一个将字符串拆分为L = ['111', '2', '3', '4'] 的列表。我的方法是让一组检查它是否是数字,然后检查该组的重复。像这样的

L = re.findall('\d[\1+]', s)

我认为\d[\1+] 基本上会检查“数字”或“数字+”相同的重复。我认为这可能会做我想要的。

【问题讨论】:

  • 你知道字符串是否只包含数字吗?
  • @thefourtheye :不假设它也会包含非数字
  • 我的印象是您正在寻找r_e = "(1*)(2*)(3*)(4*)",它给出了re.findall(r_e, s)[0] => ('111', '2', '3', '4')
  • 通过列表排序集合:如果不需要排序则可以使用r_e = "((?P<o>1+)|(?P<to>2+)|(?P<th>3+)|(?P<f>4+))*"然后re.search(r_e, s).group('o', 'to', 'th', 'f')

标签: python regex string


【解决方案1】:

试试这个:

s = '111234'

l = re.findall(r'((.)\2*)', s)
## it this stage i have [('111', '1'), ('2', '2'), ('3', '3'), ('4', '4')] in l

## now I am keeping only the first value from the tuple of each list
lst = [x[0] for x in l]

print lst

输出:

['111', '2', '3', '4']

【讨论】:

  • 为什么要创建一个元组?是因为要找到两个组吗?
  • 是的,它适用于两组。
【解决方案2】:

如果要对所有重复的字符进行分组,也可以使用itertools.groupby,像这样

from itertools import groupby
print ["".join(grp) for num, grp in groupby('111234')]
# ['111', '2', '3', '4']

如果你想确保只需要数字,那么

print ["".join(grp) for num, grp in groupby('111aaa234') if num.isdigit()]
# ['111', '2', '3', '4']

【讨论】:

    【解决方案3】:

    使用re.finditer():

    >>> s='111234'
    >>> [m.group(0) for m in re.finditer(r"(\d)\1*", s)]
    ['111', '2', '3', '4']
    

    【讨论】:

      【解决方案4】:

      如果您不想使用任何库,那么这里是代码:

      s = "AACBCAAB"
      L = []
      temp = s[0]
      for i in range(1,len(s)):
          if s[i] == s[i-1]:
              temp += s[i]
          else:
              L.append(temp)
              temp = s[i]
          if i == len(s)-1:
              L.append(temp)
      print(L)
      

      输出:

      ['AA', 'C', 'B', 'C', 'AA', 'B']
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-10-23
        • 1970-01-01
        • 2014-06-24
        • 2019-04-16
        • 2021-04-05
        相关资源
        最近更新 更多