2017-09-14 1 views
1

정규식을 작성하여 기존 IRC 로그를 구문 분석하려고합니다.로그를 구문 분석하는 정규식입니다.

정규 표현식 :

(\d\d:\d\d)(<)(@|\+)(.+?)>(.*) 

LOG 예 : 내가 연산자이없는 사용자를 제외하고 로그에서 필요한 모든 구문 분석 할 수있었습니다

= 00:00<@billy> text text text text text text text text text text text text text text text 
= 00:03<+tom> text text text text text text 
= 00:03<somedude> text text 

(@) 또는 음성 (+) 상태를 표시합니다. 내가 정규식을 실행할 때

따라서, 나는 다음과 같은 얻을 :

[('00:00', '<', '@', 'bill', " text text text text text text text text text text text text text text text ")] 
[('00:00', '<', '+', 'tom', " text text text text text text ] 
[] 

따라서, 'somedude는'행방 불명입니다. 누구든지 더 나은 접근 방법에 대한 힌트를 얻을 수 있을까요?

+1

'? '를 추가하여 해당 그룹을 선택 가능하게 만드십시오. '(\ d \ d : \ d \ d) (<) ([@ +]?) (. +?)> (. *)'. https://regex101.com/r/XJESLT/1을 참조하십시오. 글쎄요, 어떤 사람들은 여기서 줄지 모릅니다. 당신의 필요에 따라 패턴을 다시 뱀파이어로 보내주십시오. –

+1

어쩌면 ['(\ d {2} : \ d {2}) <([@+]?[^>] *)> (https://regex101.com/r/XJESLT/2)가 더 낫습니까? ('[^>]'은 개행 문자와 일치 할 수 있습니다.'[^> \ n] *'이 더 좋을 수도 있습니다. –

+0

@ WiktorStribi 어떤 제안도 나에게 효과가 없었습니다. 그게 도움이된다면're'로 파이썬 3.0을 사용하고 있습니다. – icomefromchaos

답변

1

주요 포인트는 (@|\+)?을 추가하여 @ 또는 +가 선택하게하는 것입니다, 또는 - 더 - [@+] =>[@+]?. 문자 클래스에있는 +을 이스케이프 할 필요가 없으므로 클래스 내부의 리터럴 플러스 기호와 일치합니다.

파이썬 3에서는 정규 표현식을 명명 된 캡처 그룹과 함께 사용하는 것이 좋습니다.

import re 
ss = [ '= 00:00<@billy> text text text text text text text text text text text text text text text ', 
'= 00:03<+tom> text text text text text text ', 
'= 00:03<somedude> text text'] 
for s in ss: 
    m = re.search(r'(?P<time>\d{2}:\d{2})<(?P<user>[@+]?[^>]*)>(?P<message>.*)', s) 
    if m: 
     print(m.groupdict()) 

Python demo online, 출력 참조 :

{'time': '00:00', 'message': ' text text text text text text text text text text text text text text text ', 'user': '@billy'} 
{'time': '00:03', 'message': ' text text text text text text ', 'user': '+tom'} 
{'time': '00:03', 'message': ' text text', 'user': 'somedude'} 

패턴의 자세한 사항을

  • (?P<time>\d{2}:\d{2}) - 그룹 "시간": 2 자리, :, 2 자리
  • < - <
  • (?P<user>[@+]?[^>]*) - 그룹 "사용자": 1 또는 다음 >
  • > 이외의 0+ 문자 0 @ 또는 +, 그리고 - >
  • (?P<message>.*) - 그룹 "메시지"어떤 0+ 문자의 최대 행의 끝
관련 문제