2009-06-06 11 views
14

Existe-t-il un moyen plus simple d'écrire de longs motifs regex en python? J'ai vu cette approche quelque part mais regex dans python n'autorise pas les listes.Nettoyer les expressions régulières Python

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

Répondre

25

Vous pouvez utiliser le mode verbeux pour écrire des expressions régulières plus lisibles. Dans ce mode:

  • Les espaces dans le modèle sont ignorés, sauf dans une classe de caractères ou précédés d'une barre oblique inverse non échappée.
  • Lorsqu'une ligne contient un '#' ni dans une classe de caractères, ni précédée d'une barre oblique inverse non échappée, tous les caractères du caractère "#" le plus à gauche jusqu'à la fin de la ligne sont ignorés.

Les deux déclarations suivantes sont équivalentes:

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

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

(Tiré de la documentation de verbose mode)

+3

Il pourrait être intéressant de souligner que c'est le « re.X » qui signifie le mode verbeux qui équivaut à l'écriture « re.VERBOSE ». – Zitrax

2

Vous pouvez utiliser les commentaires dans regex, ce qui les rend beaucoup plus facile à lire. Prenons un exemple 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

... tant que vous les compilez avec re.VERBOSE, selon la suggestion d'Ayman. –

13

Bien que la suggestion de @ Ayman à propos re.VERBOSE est une meilleure idée, si tout ce que vous voulez est ce que vous faites preuve, il suffit de faire:

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

et concaténation automatique de Python les littéraux de chaîne adjacents (comme ceux de C, btw) feront le reste ;-).

+1

ce serait l'auto-concaténation de Python COMBINÉ avec la jonction automatique de Python entre parenthèses et parens. – Triptych

Questions connexes