2017-09-14 233 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+字符,直到行