嗨,我似乎无法弄清楚如何从日志文件中提取日期和 PID。 我正在尝试显示日期,然后显示 pid,如下所示。但它不会显示 PID,只显示日期。
请查看我的代码:
def show_time_of_pid(line):
pattern = r"^([\w+]*[\s\d\:]+.[\[(\d+)\]])"
result = re.search(pattern, line)
return result
print(show_time_of_pid("Jul 6 14:01:23 computer.name CRON[29440]: USER (good_user)")) # Jul 6 14:01:23 pid:29440
<re.Match object; span=(0, 14), match='Jul 6 14:01:23'>
我很期待
Jul 6 14:01:23 pid:29440
我明白了
<re.Match object; span=(0, 14), match='Jul 6 14:01:23'> **NO PID DISPLAYED
我可能会写这样的东西:
def show_time_of_pid(line):
pattern = r"^(\w{3}) \s (\d+) \s ([\d:]+) \s .[^[]+\[(\d+)]:.*"
result = re.search(pattern, line, flags=re.VERBOSE)
return result.groups()
print(show_time_of_pid("Jul 6 14:01:23 computer.name CRON[29440]: USER (good_user)"))
使用
re.VERBOSE
让我们可以将内容分开以便于阅读。这里我们有几个不同的比赛组:
(\w{3})
与月份名称匹配(\d+)
匹配该月的日期([\d:]+)
与时间相符[^[]+\[(\d+)]
与 PID 匹配(“一堆不是 [
的字符,后跟 [
,然后是一串数字,然后是 ]
)每组之间用空格分隔 (
\s
)。
运行上面的代码会产生:
('Jul', '6', '14:01:23', '29440')
你可以更喜欢外部捕获组;通过写作:
import re
def show_time_of_pid(line):
pattern = r"^((\w{3}) \s (\d+) \s ([\d:]+)) \s .[^[]+\[(\d+)]:.*"
result = re.search(pattern, line, flags=re.VERBOSE)
return result.groups()
print(show_time_of_pid("Jul 6 14:01:23 computer.name CRON[29440]: USER (good_user)"))
我们在第一个捕获组中获取整个日期字符串:
('Jul 6 14:01:23', 'Jul', '6', '14:01:23', '29440')
当然,我们可以通过使用命名捕获组取回带标签的字典,而不仅仅是列表:
import re
def show_time_of_pid(line):
pattern = r"^(?P<timestamp>(?P<month>\w{3}) \s (?P<day>\d+) \s ([\d:]+)) \s .[^[]+\[(?P<pid>\d+)]:.*"
result = re.search(pattern, line, flags=re.VERBOSE)
return result.groupdict()
print(show_time_of_pid("Jul 6 14:01:23 computer.name CRON[29440]: USER (good_user)"))
产生:
{'timestamp': 'Jul 6 14:01:23', 'month': 'Jul', 'day': '6', 'pid': '29440'}