2017-09-14 85 views
1

我想寫一個正則表達式來解析出我有一箇舊的IRC日誌。正則表達式解析日誌。

正則表達式:

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

日誌示例:

= 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żew沒有任何建議適用於我。如果有幫助,我使用Python 3.0和're'。 – icomefromchaos

回答

1

主要的一點是(@|\+)後使@+任選通過添加?,或 - 更好 - [@+] =>[@+]?。請注意,您不需要在字符類中跳過+,因爲它與類中的文字加號符合。

在Python 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+字符,直到行