Quiero procesar cada línea en mi archivo de registro y extraer la IPdirección si la línea coincide con mi patrón. Hay varios tipos diferentes de mensajes, en el ejemplo a continuación estoy usando p1 andp2`.
Podía leer el archivo línea por línea, y para cada línea coincidir con cada patrón. Pero como puede haber muchos más patrones, me gustaría hacerlo de la manera más eficiente posible. Esperaba compilar estos patrones en un objeto, y hacer la coincidencia solo una vez para cada línea:
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'])
pero el código anterior no funciona, se queja de que ipse usa dos veces.
¿Cuál es la forma más elegante de lograr mi objetivo?
EDITAR:
He modificado mi código basado en la respuesta de @Dev Khadka.
Pero todavía estoy luchando sobre cómo manejar adecuadamente las múltiples ipcoincidencias. El siguiente código imprime todas las IP que coinciden con p1:
for line in sys.stdin:
match = c.search(line)
if match:
print(match['ip1'])
Pero algunas líneas no coinciden p1. Ellos coinciden p2. es decir, obtengo:
1.2.3.4
None
2.3.4.5
...
¿Cómo se imprime la IP correspondiente, cuando no sé que era wheter p1, p2, ...? Todo lo que quiero es la IP. No me importa qué patrón coincida.