2010-04-26 9 views
11

Quando si usano le variabili (è la parola corretta?) Nelle espressioni regolari python come questa: "blah (? P \ w +)" ("valore" sarebbe la variabile), come potrebbe fai in modo che il valore della variabile sia il testo dopo "blah" fino alla fine della riga o in un determinato personaggio che non presta attenzione al contenuto effettivo della variabile. Ad esempio, questo è pseudo-codice per quello che voglio:Espressioni regolari Python che assegnano a gruppi denominati

>>> import re 
>>> p = re.compile("say (?P<value>continue_until_text_after_assignment_is_recognized) endsay") 
>>> m = p.match("say Hello hi yo endsay") 
>>> m.group('value') 
'Hello hi yo' 

Nota: il titolo probabilmente non è comprensibile. Questo perché non sapevo come dirlo. Scusa se ho causato qualche confusione.

+0

Ho corretto un po 'il tuo titolo, ma penso che fosse chiaro dal tuo esempio di codice cosa volevi (almeno, spero di averlo interpretato correttamente). –

+0

FYI, il materiale tra parentesi è chiamato "gruppo". Nel tuo esempio "valore" è un nome. Quindi, stai abbinando un "gruppo con nome". – Stephen

risposta

12

Per questo ci si vuole un'espressione regolare di

"say (?P<value>.+) endsay" 

Il periodo corrisponde a qualsiasi carattere, e il segno più indica che che dovrebbe essere ripetuto una o più volte ... così .+ intende una qualsiasi sequenza di uno o più caratteri. Quando metti il ​​endsay alla fine, il motore delle espressioni regolari si assicurerà che qualsiasi cosa corrisponda, in realtà finisca con quella stringa.

+0

ha funzionato perfettamente! Grazie. – None

10

È necessario specificare ciò che si desidera far corrispondere se il testo è, per esempio,

say hello there and endsay but some more endsay 

Se si desidera far corrispondere l'intero hello there and endsay but some more stringa, @ risposta di David è corretta. In caso contrario, per abbinare solo hello there and, il modello deve essere:

say (?P<value>.+?) endsay 

con un punto interrogativo dopo il segno più per renderlo non avido (di default è avido, inghiottendo tutto il possibile pur consentendo una corrispondenza complessiva: non-goloso significa che divora come piccolo possibile, sempre consentendo una corrispondenza generale).

+0

Ho pensato a questo, ma dato il discorso dell'OP sull'abbinamento fino alla fine della linea, sembrava che un avido operatore sarebbe appropriato. Ancora, +1. –

Problemi correlati