2011-12-29 7 views
6

Vorrei combinare una variabile e un modello python. Come posso farlo?Espressione regolare di Python: combinazione di un formato di modello re con una variabile

di seguito è ciò che mi piacerebbe fare.

re.search(r'**some_variable+pattern**',str_for_pattern_match,flags) 

Grazie per il vostro aiuto.

+0

In realtà dubito che un'espressione regolare a partire da due stelle e termina con due stelle è uno valido –

+0

Come nota per le risposte, voglio solo aggiungere - è necessario prestare molta attenzione al valore variabile, in quanto potrebbe essere trattato come cose regexp, dando risultati errati dopo l'applicazione di questa espressione regolare. – demalexx

+0

[** Questa domanda **] (http://stackoverflow.com/questions/6930982/variable-inside-python-regex) è simile alla tua. Potrebbe aiutarti. –

risposta

4
re.search(r'**{0}+pattern**'.format(variable_name), str_for_pattern_match, flags) 

ora tutto il vostro {…} saranno interpretati come string format segnaposto.

+3

Una cosa da notare, però: se la variabile ha metacaratteri speciali, saranno presi come sono ... Se non è voluto, si potrebbe voler circondare il segnaposto con '\ Q' e' \ E': 'r ' \ Q {0} \ E' – fge

14

La stringa solita formattazione modo funziona bene

re.search(r'**%s+pattern**' % some_variable, str_for_pattern_match, flags) 
5

pattern di espressione regolari non sono alcuni particolari cosa in più che Python tratta appositamente. Un pattern è solo un valore di stringa perfettamente normale, che il modulo re interpreterà come un pattern.

Quindi la domanda non è "come posso usare una variabile in un modello?", Ma piuttosto "come posso costruire una stringa basata su una variabile?".

I documenti Python hanno molte informazioni su come farlo. Particolarmente utile sarà la documentazione su string methods. Il più importante di questi allo scopo di costruire espressioni regolari probabilmente sarà str.format (come dimostrato nella risposta di eumiro), che ha a large section of its own che descrive come formattare i tipi di dati di base in stringhe di modelli in quasi tutti i modi che si possano desiderare.

Se riesci a padroneggiare le operazioni di base sulle stringhe, inserire una variabile in un'espressione regolare sarà l'ultimo di quello che puoi fare!

3

È necessario prestare attenzione quando si inseriscono stringhe in uno schema di espressione regolare.

Questo perché la stringa può contenere special regexp characters che può causare errori o fornire risultati imprevisti.

Per dare un esempio:

>>> import re 
>>> s = 'one*two*three*four*five' 
>>> t = '*f' 
>>> r = re.compile(r'%s\w+' % t) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/lib/python2.7/re.py", line 190, in compile 
    return _compile(pattern, flags) 
    File "/usr/lib/python2.7/re.py", line 244, in _compile 
    raise error, v # invalid expression 
sre_constants.error: nothing to repeat 

Questo fallisce perché la stringa inserita contiene *, che è un carattere speciale regexp.

Tuttavia, questo problema può essere affrontato utilizzando la funzione re.escape sulla stringa inserita:

>>> r = re.compile(r'%s\w+' % re.escape(t)) 
>>> r.findall(s) 
['*four', '*five'] 
Problemi correlati