2011-11-16 6 views
7

Sto provando a scaricare i dati da un file di esportazione SQL con un'espressione regolare. Per abbinare il campo del contenuto del post, io uso '(?P<content>.*?)'. Funziona bene la maggior parte delle volte, ma se il campo contiene la stringa '\ n' l'espressione regolare non corrisponde. Come posso modificare l'espressione regolare per abbinarli? Grazie!Espressione regolare: come abbinare una stringa contenente " n" (newline)?

Esempio (sto usando Python):

>>> re.findall("'(?P<content>.*?)'","'<p>something, something else</p>'") 
['<p>something, something else</p>'] 

>>> re.findall("'(?P<content>.*?)'","'<p>something, \n something else</p>'") 
[] 

P.S. Apparentemente, tutte le stringhe con "\" nella parte anteriore sono trattate come caratteri di escape. Come posso dire a regx di trattarli così come sono?

risposta

21

Si consiglia di utilizzare l'opzione DOTALL:

>>> re.findall("'(?P<content>.*?)'","'<p>something, \n something else</p>'", re.DOTALL) 
['<p>something, \n something else</p>'] 

Vedi this.

+0

Grazie! Inoltre, per esempio, se ho scritto '\ a' nella stringa, sarà convertito in '\ x07'. C'è un modo per tenerli così come sono? O se non importa quando li metto nel database? –

+1

'\ x07' è solo un modo per Python per rappresentare il personaggio con il codice 7. Un altro modo per rappresentarlo è scrivere' \ a'. La stringa contiene in realtà solo un singolo carattere in entrambi i casi. Puoi confermare ciò controllando 'len (" \ x07 ")' e 'len (" \ a ")'. Prova anche a confrontare '" \ a "==" \ x07 "' o cercando '" a "' in '" \ a "': '" \ a ".find (" a ")' o per '" 0 " 'in' "\ x07" ':' "\ x07" .find ("0") '. I risultati dovrebbero essere molto istruttivi. –

+0

Ciao Adam! Sta ancora creando un problema, se la stringa di origine contiene \ 'Il risultato sarà convertito in', che interromperà i comandi sql. Quindi è importante avere la stringa "così com'è" –

3

è necessario il modificatore di dotall, per fare il punto corrisponde anche caratteri di nuova riga.

re.S
re.DOTALL
Fai la '' carattere speciale corrisponde a qualsiasi carattere a tutti, inclusa una nuova riga; senza questa bandiera, '.' corrisponderà a qualsiasi cosa tranne una nuova riga.

Guardalo here on docs.python.org