2011-04-11 117 views
49

我試圖在Python 2.6中使用re來查找更大數字序列中的每個10位數字序列。Python的正則表達式找到所有重疊的匹配?

我很容易抓住沒有重疊的比賽,但我希望在數字系列中的每一場比賽。例如。

「123456789123456789」

我應該得到以下列表:

[1234567891,2345678912,3456789123,4567891234,5678912345,6789123456,7891234567,8912345678,9123456789] 

我發現一個「前瞻」的引用,但我見過的例子只能說明對數字相當比較大的分組,我還沒有能夠將它們轉換成兩位數字以外。

+6

當重疊匹配開始於同一點時,例如,匹配「a | ab | abc」和「abcd」只會返回一個結果,所提出的解決方案將不起作用。是否有解決方案,不涉及多次調用match(),手動跟蹤「結束」邊界? – 2011-10-28 19:10:09

+0

@VítorDeAraújo:像'(a | ab | abc)'這樣的重疊正則表達式通常可以被重寫爲與嵌套的捕獲組不重疊的重寫表達式。 '(a(b(c)?)?)?',我們在開箱比賽時忽略最外面的(即最左邊的)捕獲組。毫無疑問,這是輕微的痛苦,不太清晰。這也將是一個更高性能的匹配正則表達式。 – smci 2017-11-20 02:30:11

回答

96
import re 
s = "123456789123456789" 
matches = re.finditer(r'(?=(\d{10}))',s) 
results = [int(match.group(1)) for match in matches] 
# results: 
# [1234567891, 
# 2345678912, 
# 3456789123, 
# 4567891234, 
# 5678912345, 
# 6789123456, 
# 7891234567, 
# 8912345678, 
# 9123456789] 
+1

你先生,太棒了。謝謝! – danspants 2011-04-11 05:03:39

+1

我的回答至少比這個快2倍。但是這個解決方案很棘手,我贊成它。 – eyquem 2013-07-05 10:33:24

+0

任何人都可以解釋爲什麼它的作品? – qkhhly 2013-07-08 17:19:09

18

我喜歡正規表達式,但在這裏並不需要。

只需

s = "123456789123456789" 

n = 10 
li = [ s[i:i+n] for i in xrange(len(s)-n+1) ] 
print '\n'.join(li) 

結果

1234567891 
2345678912 
3456789123 
4567891234 
5678912345 
6789123456 
7891234567 
8912345678 
9123456789 
+0

只有在這裏才需要正則表達式,因爲你正在應用「更大系列數字」中的特殊知識,所以你已經知道每個位置'0 <= i smci 2017-11-20 02:34:21

49

您也可以嘗試使用new Python regex module,它支持重疊的匹配。

>>> import regex as re 
>>> s = "123456789123456789" 
>>> matches = re.findall(r'\d{10}', s, overlapped=True) 
>>> for match in matches: print match 
... 
1234567891 
2345678912 
3456789123 
4567891234 
5678912345 
6789123456 
7891234567 
8912345678 
9123456789 
+1

這非常有幫助,謝謝! – VedTopkar 2015-04-03 17:41:26