"Canonical "Traducción de Python de su fragmento ...:
import re
myre = re.compile(r'(.*?):([^-]*)-(.*)')
for line in lines:
mo = myre.search(line)
field_1, field_2, field_3 = mo.groups()
Importación re
es obligatorio (las importaciones normalmente se realizan en la parte superior de un módulo, pero eso no es obligatorio). Precompilar el RE es opcional (si usa la función re.search
en su lugar, compilará su patrón sobre la marcha) pero recomendado (para que no confíe en el caché del módulo de objetos RE compilados para su rendimiento, y también para tener un objeto RE y llame a sus métodos, que es más común en Python).
Puede usar el método match
(que siempre trata de hacer coincidir desde el principio, si su patrón comienza con '^'
) o el método search
(que intenta hacer coincidir en cualquier lugar); con su patrón dado, deberían ser equivalentes (pero no estoy 100% seguro).
El método .groups()
devuelve todos los grupos coincidentes para que pueda asignarlos de un trago (usar una lista en Python, como usar una matriz en Perl, probablemente sería más normal, pero desde que eligió usar escalares en Perl puedes hacer el equivalente en Python también).
Esto fallará con una excepción si alguna línea no coincide con la RE, lo cual está bien si sabes que todas coinciden (no estoy seguro de cuál es el comportamiento de tu Perl, pero creo que podría "reutilizar" la los valores de la línea coincidente anterior en su lugar, lo cual es peculiar ... a menos que, de nuevo, sepa que todas las líneas coinciden ;-). Si desea acaba de saltar líneas no coincidentes, cambie la última declaración a los dos siguientes:
if mo:
field_1, field_2, field_3 = mo.groups()
Creo que estás confundiendo con Python Perl; Simplemente lea 'import this' (es decir, The Zen of Python, o simplemente' python -c 'import this "| grep -i there') –
@AleksiTorhamo ¿Tal vez está confundiendo la seriedad con una broma? ;) – FMc
Ah, bien :-) Es solo que esta fue la segunda vez en un día que me encontré con alguien que decía eso, así que pensé que sería mejor que errar por el lado ingenuo/informativo :) (Y sí, yo ' Estoy bastante seguro de que el otro * tipo * hablaba en serio: D) –