regexp strangeness

Peter Otten __peter__ at web.de
Thu Apr 9 22:05:01 CEST 2009


Dale Amon wrote:

> This finds nothing:
> 
> import re
> import string
> card       = "abcdef"
> DEC029     = re.compile("[^&0-9A-Z/ $*,.\-:#@'=\"[<(+\^!);\\\]%_>?]")
> errs       = DEC029.findall(card.strip("\n\r"))
> print errs
> 
> This works correctly:
> 
> import re
> import string
> card       = "abcdef"
> DEC029     = re.compile("[^&0-9A-Z/ $*,.\-:#@'=\"[<(+\^!)\\;\]%_>?]")
> errs       = DEC029.findall(card.strip("\n\r"))
> print errs
> 
> They differ only in the positioning of the quoted backslash.
> 
> Just in case it is of interest to anyone.

You have to escape twice; once for Python and once for the regular
expression. Or use raw strings, denoted by an r"..." prefix:

>>> re.findall("[^&0-9A-Z/ $*,.\-:#@'=\"[<(+\^!);\\\]%_>?]", "abc")
[]
>>> re.findall("[^&0-9A-Z/ $*,.\-:#@'=\"[<(+\^!);\\\\\\]%_>?]", "abc")
['a', 'b', 'c']
>>> re.findall(r"[^&0-9A-Z/ $*,.\-:#@'=\"[<(+\^!);\\\]%_>?]", "abc")
['a', 'b', 'c']

Peter



More information about the Python-list mailing list