0

我正在尽我所能学习编程,而且我一直从 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 命令时,我已经做了两个单独的语句来查找用户名 - 为这两个创建一个超级正则表达式可能是可能的,但我已经很头疼了。

谁能帮我找出问题?

4

1 回答 1

0

您的[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']
于 2013-05-01T19:49:23.410 回答