Tutorial :Clean Python Regular Expressions



Question:

Is there a cleaner way to write long regex patterns in python? I saw this approach somewhere but regex in python doesn't allow lists.

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


Solution:1

You can use verbose mode to write more readable regular expressions. In this mode:

  • Whitespace within the pattern is ignored, except when in a character class or preceded by an unescaped backslash.
  • When a line contains a '#' neither in a character class or preceded by an unescaped backslash, all characters from the leftmost such '#' through the end of the line are ignored.

The following two statements are equivalent:

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

(Taken from the documentation of verbose mode)


Solution:2

Though @Ayman's suggestion about re.VERBOSE is a better idea, if all you want is what you're showing, just do:

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

and Python's automatic concatenation of adjacent string literals (much like C's, btw) will do the rest;-).


Solution:3

You can use comments in regex's, which make them much more readable. Taking an example from 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   /  

Note:If u also have question or solution just comment us below or mail us on toontricks1994@gmail.com
Previous
Next Post »