2011-04-11 7 views
49

私は、Python 2.6でreを使って、より大きい一連の数値の中で10桁の数字のシリーズを見つけることを試みています。Pythonの正規表現はすべて重複する一致を見つけますか?

私は簡単に重複したマッチを取得することはできませんが、私は数字のシリーズですべてのマッチが欲しいです。例えば。

私は次のリストを取得する必要「123456789123456789」

:私は「先読み」への参照を見つけたが、私が見てきた例のみではなく数字のペアを示し

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

を大きなグループよりも、2桁を超えて変換することはできませんでした。

+6

提示ソリューションが動作しません。 match()を複数回呼び出す必要がなく、手動で 'end'境界を追跡するソリューションがありますか? –

+0

@VítorDeAraújo: '(a | ab | abc)のような重複する正規表現は、ネストされたキャプチャグループで重複しないものとして一般に書き換えられます。 (a(b(c)?)?) 'は、一致をアンパックするときに一番外側の(つまり一番左の)キャプチャグループ以外のすべてを無視します。確かに、これはやや苦痛で読みにくいです。これはまた、マッチするためのより効果的な正規表現になります。 – smci

答えて

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

+1

私の答えは、これより2倍以上速いです。しかし、この解決策は難しいです、私はそれをupvote。 – eyquem

+0

誰でもそれがなぜ機能するのか説明できますか? – qkhhly

18

私はregexesが好きですが、ここでは必要ありません。

単に

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

49

また、重複マッチをサポートしていnew Python regex moduleを、使用して試すことができます。 1つの結果だけを返します。「ABCD」に対して「ABC | | AB」重複マッチがマッチング、例えば、同じポイントで起動したときに

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

関連する問題