![](/img/trans.png)
[英]Adjust Python Regex to not include a single digit in the findall results
[英]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.