【问题标题】:Regular expression to parse log.用于解析日志的正则表达式。
【发布时间】:2017-09-14 14:45:16
【问题描述】:

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

【问题讨论】:

  • 通过添加? 使该组成为可选组。 (\d\d:\d\d)(&lt;)([@+]?)(.+?)&gt;(.*)。见regex101.com/r/XJESLT/1。好吧,我想这里有些组是多余的,请随时根据您的需要重新修改模式。
  • 看,也许(\d{2}:\d{2})&lt;([@+]?[^&gt;]*)&gt;(.*) 更好? ([^&gt;] 可能匹配换行符,[^&gt;\n]* 可能会更好)
  • @WiktorStribiżew 没有任何建议对我有用。如果有帮助,我正在使用带有re 的 Python 3.0。
  • @WiktorStribiżew 这是我的打字错误。现在效果很好。谢谢。
  • 我根据我的第二个建议发布了答案。

标签: regex regex-group


【解决方案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&lt;time&gt;\d{2}:\d{2}) - 组“时间”:2 位,:,2 位
  • &lt; - 一个&lt;
  • (?P&lt;user&gt;[@+]?[^&gt;]*) - 组“用户”:1 或 0 @+,然后是除 &gt; 之外的任何 0+ 字符
  • &gt; - 一个&gt;
  • (?P&lt;message&gt;.*) - 组“消息”:任何 0+ 个字符,直到行尾

【讨论】:

    猜你喜欢
    • 2013-05-04
    • 1970-01-01
    • 1970-01-01
    • 2011-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多