2011-12-28 4 views
3

문자열의 숫자 쌍을 일치시키고 그룹으로 캡처하려고하지만 마지막 그룹 만 캡처 할 수있는 것 같습니다.캡쳐 그룹을 하나 이상 일치시키는 정규식

Regex: 
(\d\d){1,3} 

입력 문자열 : 123456 789101

1 경기 : 123456
그룹 1 : 56

2 경기 : 789101
그룹 1 : 01

내가 원하는 것은 캡처하는 것입니다 모든 그룹은 다음과 같습니다 : 경기 1 : 123456
그룹 1 : 12
그룹 2 : 34
그룹 3 : 56

* 업데이트는 따라서, 단일 패스에서 모든 그룹을 캡처 할 수는 .NET 예를 들면, 여러 그룹을 캡처하지 않습니다 그것은 파이썬과 같은
을 re.findall ('\ d \ d', '123456')이 작업을 수행합니다.

+0

의 중복 가능성 [파이썬 정규식 여러 그룹 (http://stackoverflow.com/questions/4963691/), [여러 경기와 정규 표현식 그룹 캡처] (HTTP : //stackoverflow.com/questions/5598340/), [Python regexes : 그룹의 여러 일치하는 방법에 액세스하는 방법?] (http://stackoverflow.com/questions/5060659/) – outis

답변

6

당신은 할 수없는 단 하나의 정규 표현식을 사용하여 . 그것은 카운트의 특별한 경우이며, 정규식 패턴으로는 할 수 없습니다. \ D \ D 당신을 얻을 것이다 :

그룹 1 : 12 그룹 2 : 23 그룹 3을 : 34 ...

파이썬에서

정규식 라이브러리, 즉 re.findall() 않는 비 중첩 루틴과 함께 제공 속임수. 같이 :

 re.findall('\d\d', '123456') 

['12', '34', '56']

2
(\d{2})+(\d)? 

나는 파이썬이 일치를 처리하는 방법을 잘 모르겠어요,하지만 난 그것을

2

이 시도 할 것입니다 방법입니다

import re 
re.findall(r'\d\d','123456') 
+0

@ridgerunner 제안 주셔서 감사합니다. 내 대답을 편집했습니다. –

1

이 당신이 원하는 무엇인가 돌아갑니다? :

import re 

regx = re.compile('(?:(?<=)|(?<=\A)|(?<=\r)|(?<=\n))' 
        '(\d\d)(\d\d)?(\d\d)?' 
        '(?= |\Z|\r|\n)') 

for s in (' 112233 58975 6677 981 897899\r', 
      '\n123456 4433 789101 41586 56 21365899 362547\n', 
      '0101 456899 1 7895'): 
    print repr(s),'\n',regx.findall(s),'\n' 

결과

' 112233 58975 6677 981 897899\r' 
[('11', '22', '33'), ('66', '77', ''), ('89', '78', '99')] 

'\n123456 4433 789101 41586 56 21365899 362547\n' 
[('12', '34', '56'), ('44', '33', ''), ('78', '91', '01'), ('56', '', ''), ('36', '25', '47')] 

'0101 456899 1 7895' 
[('01', '01', ''), ('45', '68', '99'), ('78', '95', '')] 
관련 문제