用于解析日志的正则表达式。

Regular expression to parse log.

我正在尝试编写一个正则表达式来解析我拥有的旧 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'。有人会对如何更好地解决这个问题有任何提示吗?

要点是通过在 (@|\+) 之后添加 ? 使 @+ 可选,或者 - 更好 - [@+] => [@+]?。请注意,您不需要在字符 class 中转义 +,因为它与 class.

中的文字加号相匹配

在 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}) - 组 "time":2 位数字,:,2 位数字
  • < - 一个 <
  • (?P<user>[@+]?[^>]*) - 组 "user":1 或 0 @+,然后是 >[=47= 以外的任何 0+ 个字符]
  • > - 一个>
  • (?P<message>.*) - 组 "message":任何 0+ 个字符,直到行尾