我正在尝试显示日志文件的日期时间和IP地址:
Apr 20 07:03:53 123.345.45.123
^ ^ ^ ^
|---datetime--| |-----IP-----|
我的代码:
datetimeRegex = re.compile(r'^\w{3}\s\d\d\s\d\d:\d\d:\d\d')
IPRegex = re.compile(r'\d+.\d+.\d+.\d{1,3}')
f = open("logfile.log","r")
count = 0
for line in f.readlines():
datetime = re.match(datetimeRegex, line)
IPaddr = re.match(IPRegex, line)
if datetime and IPaddr:
count += 1
print str(count) + ":" + str(datetime.group()) + "IP: " + str(IPaddr.group())
我试图查看哪些内容不匹配,我认为IPaddr
不匹配,因为我从if语句中删除了IPaddr
,我的输出会打印日期。当我添加IPaddr
时,什么都不打印。所以我认为我没有正确匹配我的IP地址。然而,我在一个在线正则表达式测试器上尝试了一个示例IP和我的正则表达式,它似乎工作。我的REGEX中缺少什么东西吗?或者我的逻辑可能有问题?如果有更快或更有效的方法来解析日志文件,我愿意接受建议。
答案 0 :(得分:3)
将.
的所有用法替换为\.
单个句点是正则表达式中的特殊字符,表示“任何字符”。如果你想要一个文字句号,你需要使用\
字符来逃避它。
IPRegex = re.compile(r"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}")
ip = "192.168.1.1"
matches = IPRRegex.match(ip)
[OUT] <_sre.SRE_Match object at 0x0000000003349578>
答案 1 :(得分:1)
您应该使用re.search
代替re.match
,因为re.match
仅在行的开头匹配,而re.search
会在字符串中的任何位置找到匹配项。
如果你稍微调整你的正则表达式(转义.
,它们是正则表达式中的通配符并匹配除了换行符之外的所有东西,为datetimeRegex添加不必要的锚点,因为你将这个用于{ {1}},将re.match
与\d\d?
和IP正则表达式等日期匹配,以接受更多有效的IP)
Jan 1 12:34:56