用于解析日志的正则表达式。
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+ 个字符,直到行尾
我正在尝试编写一个正则表达式来解析我拥有的旧 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+ 个字符,直到行尾