【发布时间】:2020-02-13 10:21:12
【问题描述】:
我想处理日志文件中的每一行,如果行与我的模式匹配,则提取IP 地址。有几种不同类型的消息,在下面的示例中,我使用的是 p1andp2`。
我可以逐行读取文件,并且每一行都匹配每个模式。但 由于可以有更多的模式,我想尽可能高效地做到这一点。我希望将这些模式编译成一个对象,并且每行只匹配一次:
import re
IP = r'(?P<ip>\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})'
p1 = 'Registration from' + IP + '- Wrong password'
p2 = 'Call from' + IP + 'rejected because extension not found'
c = re.compile(r'(?:' + p1 + '|' + p2 + ')')
for line in sys.stdin:
match = re.search(c, line)
if match:
print(match['ip'])
但是上面的代码不起作用,它抱怨ip被使用了两次。
实现我的目标最优雅的方式是什么?
编辑:
我根据@Dev Khadka 的回答修改了我的代码。
但我仍在为如何正确处理多个 ip 匹配而苦苦挣扎。下面的代码打印所有匹配 p1 的 IP:
for line in sys.stdin:
match = c.search(line)
if match:
print(match['ip1'])
但有些行与p1 不匹配。它们匹配p2。即,我得到:
1.2.3.4
None
2.3.4.5
...
当我不知道它是p1,p2,...时,如何打印匹配的ip?我想要的只是IP。我不在乎它匹配哪种模式。
【问题讨论】:
-
你应该提供你的测试数据。
标签: python regex python-3.x