使用正则表达式在 IRC 日志中提取用户名?

Posted

技术标签:

【中文标题】使用正则表达式在 IRC 日志中提取用户名?【英文标题】:Extracting username in IRC logs with regex? 【发布时间】:2013-05-01 19:42:00 【问题描述】:

我正在尽我所能学习编程,而且我一直从 Python 开始。我目前正在编写一个 IRC 统计生成器(好像还没有足够的),并且我试图想出一个匹配特定日志格式的用户名(并且只有用户名)的正则表达式。但是,我拥有的与 re.search 不匹配

这里是一个日志格式的例子:

may 01 14:04:54 <FishCream> Wahoo!
may 01 14:05:01 <LpSamuelm> Oh, if only talking was this fun in real life.
jan 01 00:00:00 <Username>  Message goes here.
jan 01 00:00:00 *   Username Action goes here.

这里是编译语句:

findusername = re.compile("^[a-zA-Z]+\s[0-9]+\s[0-9:]\s<([A-Za-z]+)>")
finduseraction = re.compile("^[a-zA-Z]+\s[0-9]+\s[0-9:]\s\*\s+([A-Za-z]+)\s")

如您所见,我已经做了两个单独的语句,用于在用户说话和使用 /me 命令时查找用户名 - 为这两个创建一个超级正则表达式可能是可能的,但我已经很头疼了是的。

谁能帮我找出问题所在?

【问题讨论】:

【参考方案1】:

你的 [0-9:] 类只匹配 一个 字符,而不是那里的 8 个字符;添加量词:

findusername = re.compile("^[a-zA-Z]+\s[0-9]+\s[0-9:]8\s<([A-Za-z]+)>")
finduseraction = re.compile("^[a-zA-Z]+\s[0-9]+\s[0-9:]8\s\*\s+([A-Za-z]+)\s")

这假定您每次都在单独的行上输入;如果您的日志文本一次包含多行,请添加 re.MULTILINE 标志。

在您的输入示例中使用re.MULTILINE 标志和.findall() 的演示:

>>> findusername = re.compile("^[a-zA-Z]+\s[0-9]+\s[0-9:]8\s<([A-Za-z]+)>", re.MULTILINE)
>>> finduseraction = re.compile("^[a-zA-Z]+\s[0-9]+\s[0-9:]8\s\*\s+([A-Za-z]+)\s", re.MULTILINE)
>>> findusername.findall(logs)
['FishCream', 'LpSamuelm', 'Username']
>>> finduseraction.findall(logs)
['Username']

【讨论】:

哦,哇,我不敢相信我没听懂。非常感谢!顺便说一句,您还帮助我了解了我不熟悉的集合量词的语法。

以上是关于使用正则表达式在 IRC 日志中提取用户名?的主要内容,如果未能解决你的问题,请参考以下文章

在猪脚本中使用正则表达式从日志中提取字符串

Python 正则表达式从系统日志服务器中提取 FQDN

正则表达式清理日志

用正则表达式匹配 IRC 频道

Java使用正则表达式提取字段分隔的子字符串

Python学习日志13 - 正则表达式