用于拆分或查找每个数字python的正则表达式

时间:2017-12-20 23:19:06

标签: python regex

将此str var拆分为连续数字列表

的最佳解决方案是什么?

我的解决方案:

>>> str
> '2223334441214844'
>>> filter(None, re.split("(0+)|(1+)|(2+)|(3+)|(4+)|(5+)|(6+)|(7+)|(8+)|(9+)", str))
> ['222', '333', '444', '1', '2', '1', '4', '8', '44']

5 个答案:

答案 0 :(得分:4)

没有正则表达式的一种解决方案(不是数字特定的)将使用itertools.groupby()

>>> from itertools import groupby
>>> s = '2223334441214844'
>>> [''.join(g) for _, g in groupby(s)]
['222', '333', '444', '1', '2', '1', '4', '8', '44']

答案 1 :(得分:4)

更灵活的方法是使用itertools.groupby来匹配迭代中的连续组:

>>> s = '2223334441214844'
>>> import itertools
>>> [''.join(group) for key, group in itertools.groupby(s)]
['222', '333', '444', '1', '2', '1', '4', '8', '44']

key将是分组的单个键(在您的情况下,数字)。 group是组中所有项目的可迭代项。由于源iterable是一个字符串,因此每个项都是一个字符,所以为了返回完全组合的组,我们需要将这些字符重新组合在一起。

您还可以重复该组长度的键以获得此输出:

>>> [key * len(list(group)) for key, group in itertools.groupby(s)]
['222', '333', '444', '1', '2', '1', '4', '8', '44']

如果您想使用正则表达式,您可以使用反向引用来查找连续字符,而无需明确指定它们:

>>> re.findall('((.)\\2*)',  s)
[('222', '2'), ('333', '3'), ('444', '4'), ('1', '1'), ('2', '2'), ('1', '1'), ('4', '4'), ('8', '8'), ('44', '4')]

为了查找字符串中的连续字符,这与groupby将完成的内容基本相同。然后,您可以过滤掉组合匹配以获得所需结果:

>>> [x for x, *_ in re.findall('((.)\\2*)',  s)]
['222', '333', '444', '1', '2', '1', '4', '8', '44']

答案 2 :(得分:1)

如果您只需要提取连续的相同数字,您可以使用var emitter = {}; EventEmitter.call(emitter); console.log(emitter.on); 正则表达式的匹配方法:

r'(\d)\1*'

请参阅Python demo

在这里,

  • import re s='2223334441214844' print([x.group() for x in re.finditer(r'(\d)\1*', s)]) # => ['222', '333', '444', '1', '2', '1', '4', '8', '44'] - 匹配并捕获第1组任意数字
  • (\d) - 对第1组的反向引用,匹配相同的值,0 +重复。

此解决方案可以自定义以匹配任何特定的连续字符(而不是\1*,您可以使用\d - 非空白,\S - 字,\w - 特定的一组等)。如果您将[a-fA-F]替换为\d并使用.修饰符,则它将作为上面发布的re.DOTALL解决方案。

答案 3 :(得分:1)

使用捕获组和反向引用。

str = '2223334441214844'

import re
print([i[0] for i in re.findall(r'((\d)\2*)', str)])

\2匹配匹配的(\d)捕获组。列表理解是必需的,因为当RE包含捕获组时,findall返回捕获组的列表,而不是整个匹配。所以我们需要一个额外的组来获得整个匹配,然后需要从结果中提取该组。

答案 4 :(得分:0)

  

如果不导入任何外部模块怎么样?

您可以在纯python中创建自己的逻辑而无需导入任何模块这是递归方法,

string_1='2223334441214844'

list_2=[i for i in string_1]


def con(list_1):
    group = []
    if not list_1:
        return 0
    else:
        track=list_1[0]
        for j,i in enumerate(list_1):
            if i==track[0]:
                group.append(i)
            else:
                print(group)
                return con(list_1[j:])

        return group



print(con(list_2))

输出:

['2', '2', '2']
['3', '3', '3']
['4', '4', '4']
['1']
['2']
['1']
['4']
['8']
['4', '4']