2011-04-11 2 views
49

필자는 Python 2.6에서 re를 사용하여 더 큰 일련의 숫자에서 10 자리 숫자의 숫자를 찾으려고합니다.파이썬 정규식은 겹치는 모든 짝짓기를 찾았습니까?

겹치는 일치를 쉽게 잡을 수는 있지만 숫자 시리즈에서 모든 일치를 원합니다. 예 : 에서

"123456789123456789"

나는 다음과 같은 목록을 얻어야한다 :

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

나는 "내다"에 대한 참조를 발견했습니다,하지만 내가 본 예제는 숫자 만 쌍을 오히려 보여 더 큰 그룹화와 나는 두 자릿수 이상으로 그들을 변환 할 수 없었다.

+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

정규식이 좋지만 여기서는 필요하지 않습니다.

간단히

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

Regexes는 특별한 지식을 "더 큰 수의 계열"로 적용하기 때문에 여기서는 필요하지 않습니다. 그래서 당신은 이미 모든 위치'0 <= i smci

49

또한 경기 중첩 것을 지원 new Python regex module를 사용하여 시도 할 수 있습니다. 하나 개의 결과를 반환합니다 "ABCD"에 대한 "ABC | | AB A"를 중복 일치 일치, 예를 들어, 같은 지점에서 시작할 때

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