2009-09-10 5 views
18

프로그램의 출력 로그에서 (파이썬에서) 정규식 매치를하고 싶습니다. 로그는 다음과 같이 몇 가지 행이 포함알 수없는 그룹 수와 그룹으로 정규 표현식을 일치시키는 방법

... 
VALUE 100 234 568 9233 119 
... 
VALUE 101 124 9223 4329 1559 
... 
내가 VALUE로 시작하는 줄의 첫 번째 발생 후 발생 번호 목록을 캡처하고 싶은

. 즉, ('100','234','568','9233','119')을 반환하고 싶습니다. 문제는 내가 얼마나 많은 숫자가 있을지 미리 알지 못한다는 것입니다.

나는 정규식로 사용하려고 :

VALUE (?:(\d+)\s)+ 

이 선을 일치하지만 마지막 값을 포착, 그래서 난 그냥 얻을 ('119').

+1

이전 질문에 기반하여 regexps로는 불가능하다는 것을 알 수 있습니다 : http://stackoverflow.com/questions/464736/python-regular-expressions-how-to-capture-multiple-groups-from-a -wildcard-expre # 464755 –

답변

16

정규식 일치 대신 파서이 필요합니다. 귀하의 경우에는, 나는 아주 간단한 파서를 사용하는 것이 좋습니다 것, split()는 :

s = "VALUE 100 234 568 9233 119" 
a = s.split() 
if a[0] == "VALUE": 
    print [int(x) for x in a[1:]] 

당신은 당신의 입력 라인 (귀하의 질문에 정규식 사용) 예상 형식과 일치 여부를 확인하기 위해 정규 표현식을 사용할 수 있습니다

, 당신은 할 수 "VALUE"을 확인하지 않고 위의 코드를 실행하고 int(x) 변환이 항상 성공한다는 것을 이미 알고 있기 때문에 다음 문자 그룹이 모두 숫자임을 확인했기 때문에 계속 진행됩니다. 당신은 전체 파서를 작성하지 않으 또한 경우

matches = Regex.Match(log) 

foreach (Match match in matches) 
{ 
    submatches = Regex2.Match(match) 
} 

이 물론이다

2

당신은 당신이 주요 일치하는 정규식은 다음 숫자를 얻기 위해 그 경기에 두 번째 정규 표현식을 실행있어 실행할 수 있습니다 . 당신이 할 수있는 경우

+2

어떤 프로그래밍 언어입니까? –

9
>>> import re 
>>> reg = re.compile('\d+') 
>>> reg.findall('VALUE 100 234 568 9233 119') 
['100', '234', '568', '9223', '119'] 

키워드 'VALUE'는 문자열의 시작 부분에 나타나는지 확인하지 않습니다, 그리고 항목 사이에 정확히 하나 개의 공간이 있음을 확인하지 않습니다,하지만 그 별도로 단계 (또는 전혀 필요가없는 경우), 모든 문자열의 모든 숫자 시퀀스를 찾습니다.

2

여기에 설명되지 않은 또 다른 옵션은 여러 캡쳐 그룹을 갖는 것입니다.

VALUE *(\d+)? *(\d+)? *(\d+)? *(\d+)? *(\d+)? *$ 

이 정규식은 공백으로 구분 된 최대 5 자리 그룹을 캡처합니다. 잠재 그룹이 더 필요하면 *(\d+)? 블록을 복사하여 붙여 넣기 만하면됩니다.

0

나는이 똑같은 문제를 가지고 있었고 나의 해결책은 두 개의 정규 표현식을 사용하는 것이었다. 첫 번째 것은 관심있는 전체 그룹과 일치시키고 두 번째는 하위 그룹을 분석하는 것이었다. 이 경우 예를 들어, 나는이 시작 것 :

VALUE((\s\d+)+) 

이 세 경기에서 결과를해야합니다 값 [2] 마지막 공간 + 값 이후 [0] 전체 라인, [1] 물건.

[0] [2] 무시 될 수 있으며, 다음 [1] 다음과 같이 사용할 수 있습니다

\s(\d+) 

참고 :이 regexps '에 테스트되지 않은, 당신이 비록 아이디어를 얻을 바랍니다.구문 분석의 두 번째 부분은 더 복잡하고 단순히 몇 가지 숫자는 공백으로 구분하기 때문에


Greg's answer 나를에 대한 를 작동하지 않는 이유입니다.

그러나 나는 솔직히이 질문에 대해 Greg의 솔루션을 사용합니다 (아마 더 효율적입니다).

필자는 필자가 필요로하는보다 정교한 솔루션을 원하는 사람을 위해이 답변을 작성했습니다.

관련 문제