Como se indica en el encabezado, quiero expresiones regulares que me darán resultados en orden según mi 'consulta'.

line='VERSION="OTHER" POWER="LOW" FREQ="OFF" MAXTUN="BLER"'**

Ejemplo 1:

re.findall(r'FREQ="(.*?)"|VERSION="(.*?)"', line, re.MULTILINE)

La salida es:

[('', 'OTHER'), ('OFF', '')]

Y la salida deseada que prefiero es algo como:

['OFF', 'OTHER']

Ejemplo 2:

re.findall(r'VERSION="(.*?)"|FREQ="(.*?)"', line, re.MULTILINE)

La salida es la misma:

[('', 'OTHER'), ('OFF', '')]

Y la salida deseada que prefiero es algo como:

['OTHER', 'OFF']

¿Alguna sugerencia?

PD Por favor, no me pregunte qué quiero lograr y dígame que tal vez haya una mejor manera, solo si tiene alguna pregunta al respecto.

¡Gracias!

2
Jovan 13 nov. 2017 a las 13:38

2 respuestas

La mejor respuesta

Puede aprovechar un grupo de alternancia que no captura para que coincida con VERSION o FREQ (opcionalmente precedido por un límite de palabra, solo verifique si cumple con sus requisitos):

\b(?:VERSION|FREQ)="(.*?)"

Vea la demostración de expresiones regulares

Detalles

  • \b: un límite de palabra principal
  • (?:VERSION|FREQ): VERSION o FREQ
  • =" - una subcadena ="
  • (.*?) - Grupo 1 (el resultado real de findall): más de 0 caracteres que no sean caracteres de salto de línea, el menor número posible
  • ": una comilla doble.

Vea la demostración de Python:

import re
line='VERSION="OTHER" POWER="LOW" FREQ="OFF" MAXTUN="BLER"'
print(re.findall(r'\b(?:VERSION|FREQ)="(.*?)"', line))
# => ['OTHER', 'OFF']

Quizás una mejor idea es capturar pares clave-valor y asignarlos a un diccionario:

import re
line = 'VERSION="OTHER" POWER="LOW" FREQ="OFF" MAXTUN="BLER"'
results = re.findall(r'(VERSION|FREQ)="(.*?)"', line)
print(dict(results))
# => {'FREQ': 'OFF', 'VERSION': 'OTHER'}

Consulte la demostración de Python.

4
Wiktor Stribiżew 13 nov. 2017 a las 12:17

Me temo que no hay forma de coincidir en el orden que desea usando expresiones regulares: podría ejecutar la parte antes | primero, y luego la parte posterior a |. O pide el resultado después.

0
martxalen 13 nov. 2017 a las 11:11