簡體   English   中英

正則表達式用於拆分或查找所有每個數字的python

[英]Regex for split or findall each digit python

將此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']

一種不使用正則表達式的解決方案(不是特定於數字)將使用itertools.groupby()

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

更為靈活的方法是使用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是該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']

如果只需要提取連續的相同數字,則可以使用正則表達式r'(\\d)\\1*'的匹配方法:

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']

參見Python演示

這里,

  • (\\d) -將任意數字匹配並捕獲到組1中
  • \\1* -對第1組的后向引用,匹配相同的值,重復0+次。

可以自定義此解決方案以匹配任何特定的連續字符(而不是\\d ,您可以使用\\S非空格, \\w -word, [a-fA-F] -特定集合等)。 如果將\\d替換為. 並使用re.DOTALL修飾符,它將用作上面發布的itertools解決方案。

使用捕獲組和反向引用。

str = '2223334441214844'

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

\\2匹配(\\d)捕獲組匹配的任何內容。 需要列表理解,因為當RE包含捕獲組時, findall返回捕獲組的列表,而不是整個匹配項。 因此,我們需要一個額外的組來獲取整個匹配項,然后需要從結果中提取該組。

不導入任何外部模塊怎么辦?

您可以在不導入任何模塊的情況下用純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']

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM