"Canonical "Traduzione Python del tuo frammento ...:
import re
myre = re.compile(r'(.*?):([^-]*)-(.*)')
for line in lines:
mo = myre.search(line)
field_1, field_2, field_3 = mo.groups()
Importazione re
è un must (le importazioni vengono normalmente eseguite nella parte superiore di un modulo, ma non è obbligatorio). La precompilazione della RE è facoltativa (se invece usi la funzione re.search
, essa compilerà il tuo modello al volo) ma ti consigliamo (quindi non fare affidamento sulla cache dei moduli degli oggetti RE compilati per le tue prestazioni, e anche per avere un oggetto RE e chiama i suoi metodi, che è più comune in Python).
È possibile utilizzare il metodo match
(che tenta sempre la corrispondenza dall'inizio, indipendentemente dal fatto che il modello inizi o meno con '^'
) o il metodo search
(che cerca la corrispondenza ovunque); con il tuo modello dato dovrebbero essere equivalenti (ma non sono sicuro al 100%).
Il metodo .groups()
restituisce tutti i gruppi corrispondenti in modo da poterli assegnare tutti in un solo gulp (utilizzando un elenco in Python, proprio come utilizzare un array in Perl, sarebbe probabilmente più normale, ma poiché si è scelto di utilizzare gli scalari in Perl puoi fare l'equivalente anche in Python).
Questo fallirà con un'eccezione se qualsiasi riga non corrisponde alla RE, il che va bene se si sa che tutti corrispondono (non sono sicuro di quale sia il comportamento del Perl ma penso che "riutilizzerebbe" la i valori della riga di corrispondenza precedente, invece, che è particolare ... a meno che, ancora una volta tu sai che tutte le linee corrispondono ;-). Se si desidera saltare solo le linee che non corrispondono, modificare l'ultima istruzione per i due seguenti:
if mo:
field_1, field_2, field_3 = mo.groups()
fonte
2010-04-14 14:21:32
Credo che tu stia confondendo con Python Perl; Basta leggere 'import this' (ovvero, The Zen of Python, o semplicemente' python -c 'importare questo "| grep -i there') –
@AleksiTorhamo Forse stai confondendo la serietà con uno scherzo? ;) – FMc
Ah, bravo :-) E 'solo che questa è stata la seconda volta in un giorno in cui mi sono imbattuto in qualcuno che lo diceva, quindi ho pensato che sarebbe stato meglio errare dal lato ingenuo/informativo :) (E sì, io sono sicuro che l'altro * ragazzo fosse serio: D) –