2016-08-19 3 views
2

로그 파일이 있습니다. 정규식 (python)을 사용하여 구문 분석하려고합니다. 각 행에는 "BEGIN"및 "END"태그가 있습니다. 또한 한 줄에는 'BEGIN'및 'END'태그 사이에 하나 이상의 'VALUE'태그가 포함될 수 있습니다. 주어진 줄에 "VALUE"태그가 없으면 "BEGIN"및 "END"태그 사이의 문자열을 캡처하고 싶습니다. 그러나 주어진 줄에 "VALUE"태그가 있으면 "BEGIN"... "VALUE", "VALUE"... "VALUE"및 "VALUE"태그 사이의 모든 문자열을 캡처하고 싶습니다. .. "END"태그 쌍. 캡처 문자열은 비어있을 수도 있습니다.주어진 문자열 앵커간에 문자열을 캡처하는 정규식

주어진 입력 :

Line1: words we can ignoreBEGINvalue1VALUEvalue with [email protected] we can ignore 
Line2: BEGINvalue1VALUEVALUEVALUElastvalueENDwords we can ignore 
Line3: words we can ignoreBEGINlastvalueEND 

정규식은 반환해야합니다 :

Line1: (1)value1 (2)value with space (3)[email protected] (4)lastvalue 
Line2: (1)value1 (2) (3) (4)lastvalue 
Line3: (1)lastvalue 

을 정규식에만 캡처 보이는 경우에 한 줄에 둘 이상의 "VALUE"태그가 있다면 실패 이하 "BEGIN"... "VALUE"및 "VALUE"... "END"사이의 문자열은 'VALUE'을 (를) 캡처하는 데 실패합니다 ...

BEGIN(.*?)(?:VALUE(.*?))*END 
+0

이것은 PyPi 정규식 모듈에서만 작동합니다. 아래의 더 나은 대안을보십시오. –

답변

1

정규식을 완전히 사용하지 않고도 쉽게 접근 할 수 있으며 BEGIN과 END 사이의 모든 항목을 캐치 한 다음 VALUE로 분할 할 수 있습니다.

>>>test_cases = ['words we can ignoreBEGINvalue1VALUEvalue with [email protected] we can ignore', 'BEGINvalue1VALUEVALUEVALUElastvalueENDwords we can ignore', 'words we can ignoreBEGINlastvalueEND'] 
>>> patt = re.compile(r'BEGIN(.*)END') 
>>> for test in test_cases: 
...  matched = patt.search(test) 
...  if matched is not None: 
...   print matched.group(1).split('VALUE') 

['value1', 'value with space', '[email protected]', 'lastvalue'] 
['value1', '', '', 'lastvalue'] 
['lastvalue'] 
+1

한 줄에 두 개 이상의 시작 - 끝 쌍이있는 경우'r'BEGIN (. *?) END''가 더 좋습니다. –

관련 문제