2009-06-06 16 views
14

Esiste un modo più semplice per scrivere i regex lunghi in python? Ho visto questo approccio da qualche parte, ma regex in Python non consente elenchi.Pulisci espressioni regolari Python

patterns = [ 
    re.compile(r'<!--([^->]|(-+[^->])|(-?>))*-{2,}>'), 
    re.compile(r'\n+|\s{2}') 
] 

risposta

25

È possibile utilizzare la modalità dettagliata per scrivere espressioni regolari più leggibili. In questa modalità:

  • Gli spazi bianchi all'interno del modello viene ignorato, tranne quando in una classe di caratteri o preceduto da un backslash non protetto.
  • Quando una riga contiene un '#' né in una classe di caratteri né preceduta da una barra rovesciata senza caratteri di escape, tutti i caratteri dal numero più a sinistra tale '#' fino alla fine della riga vengono ignorati.

Le due istruzioni seguenti sono equivalenti:

a = re.compile(r"""\d + # the integral part 
        \. # the decimal point 
        \d * # some fractional digits""", re.X) 

b = re.compile(r"\d+\.\d*") 

(Tratto da documentazione di verbose mode)

+3

Potrebbe essere utile segnalare che è "re.X" che indica la modalità dettagliata che equivale alla scrittura di "re.VERBOSE". – Zitrax

2

È possibile utilizzare i commenti in regex di, che li rendono molto più leggibile. Prendendo un esempio dal http://gnosis.cx/publish/programming/regular_expressions.html:

/    # identify URLs within a text file 
      [^="] # do not match URLs in IMG tags like: 
       # <img src="http://mysite.com/mypic.png"> 
http|ftp|gopher # make sure we find a resource type 
      :\/\/ # ...needs to be followed by colon-slash-slash 
     [^ \n\r]+ # stuff other than space, newline, tab is in URL 
    (?=[\s\.,]) # assert: followed by whitespace/period/comma 
/
+0

... finchè li compili con re.VERBOSE, secondo il suggerimento di Ayman. –

13

Anche se il suggerimento di @ Ayman circa re.VERBOSE è un'idea migliore, se tutto quello che vuoi è ciò che si sta mostrando, basta fare:

patterns = re.compile(
     r'<!--([^->]|(-+[^->])|(-?>))*-{2,}>' 
     r'\n+|\s{2}' 
) 

e la concatenazione automatica di Python le stringhe adiacenti (molto simili a C, btw) faranno il resto ;-).

+1

questa sarebbe l'auto-concatenazione di Python COMBINATA con l'unione automatica di Python tra parentesi e parentesi. – Triptych