Quero processar todas as linhas do meu arquivo de log e extrair o IPendereço se a linha corresponder ao meu padrão. Existem vários tipos diferentes de mensagens, no exemplo abaixo, estou usando p1 andp2`.
Eu podia ler o arquivo linha por linha e para cada linha corresponder a cada padrão. Mas como pode haver muitos outros padrões, eu gostaria de fazê-lo da maneira mais eficiente possível. Eu esperava compilar esses padrões em um objeto e fazer a correspondência apenas uma vez para cada linha:
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'])
mas o código acima não funciona, ele reclama que ipé usado duas vezes.
Qual é a maneira mais elegante de alcançar meu objetivo?
EDITAR:
Modifiquei meu código com base nas respostas de @Dev Khadka.
Mas ainda estou lutando para lidar adequadamente com as várias ipcorrespondências. O código abaixo imprime todos os IPs correspondentes a p1:
for line in sys.stdin:
match = c.search(line)
if match:
print(match['ip1'])
Mas algumas linhas não correspondem p1. Eles combinamp2 . ou seja, eu recebo:
1.2.3.4
None
2.3.4.5
...
Como faço para imprimir o ip de correspondência, quando eu não sei wheter que era p1, p2...? Tudo o que eu quero é o IP. Eu não ligo para qual padrão ele combina.