2009-06-06 18 views
14

¿Existe alguna manera más clara de escribir patrones de expresiones regulares largas en python? Vi este enfoque en alguna parte pero regex en python no permite listas.Limpiar expresiones regulares de Python

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

Respuesta

25

Puede usar el modo detallado para escribir expresiones regulares más legibles. En este modo:

  • Se ignora el espacio en blanco dentro del patrón, excepto cuando se encuentra en una clase de caracteres o está precedido por una barra invertida no guardada.
  • Cuando una línea contiene un '#' en una clase de caracteres o precedida por una barra invertida no guardada, se ignoran todos los caracteres de la parte más a la izquierda como '#' hasta el final de la línea.

Las dos afirmaciones siguientes son equivalentes:

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

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

(Tomado de la documentación de verbose mode)

+3

Puede valer la pena señalar que es el "re.X" que significa el modo detallado que es equivalente a escribir "re.VERBOSE". – Zitrax

2

Puede utilizar los comentarios en de expresiones regulares, que los hacen mucho más legible. Tomando un ejemplo de 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

... siempre y cuando los compile con re.VERBOSE, según la sugerencia de Ayman. –

13

Aunque la sugerencia de @ Ayman sobre re.VERBOSE es una idea mejor, si lo que quieres es lo que está mostrando, acaba de hacer:

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

y la concatenación automática de Python de los literales de cadena adyacentes (al igual que C's, por cierto) harán el resto ;-).

+1

esto sería la autocatenación de Python COMBINADA con la unión de línea automática de Python entre corchetes y parens. – Triptych

Cuestiones relacionadas