Quiero procesar cada línea en mi archivo de registro y extraer la IP
direcció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 and
p2`.
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 ip
se 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 ip
coincidencias. 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.