When does the escape character work within raw strings?

Steven D'Aprano steve at REMOVE-THIS-cybersource.com.au
Fri May 22 11:29:16 EDT 2009


On Fri, 22 May 2009 07:47:49 -0700, walterbyrd wrote:

> On May 21, 9:44 pm, "Rhodri James" <rho... at wildebst.demon.co.uk> wrote:
> 
>> Escaping the delimiting quote is the *one* time backslashes have a
>> special meaning in raw string literals.
> 
> If that were true, then wouldn't r'\b' be treated as two characters?

It is.

>>> len(r'\b')
2



>> This calls re.sub with a pattern string object that contains two
>> characters, a backslash followed by an 'n'.  This combination *does*
>> have a special meaning to the sub function, which does it's own
>> translation of the pattern into a single newline character.
> 
> So when do I know when a raw string is treated as a raw string, and when
> it's not?

You have misunderstood. All strings are strings, but there are different 
ways to build a string. Raw strings are not different from ordinary 
strings, they're just a different way to *build* an ordinary string.

Here are four ways to make the same string, a backslash followed by a 
lowercase b:

"\\b"        # use an ordinary string, and escape the backslash
chr(92)+"b"  # use the chr() function
"\x5cb"      # use a hex escape
r"\b"        # use a raw string, no escaping needed

The results you get from all of those (and many, many more!) are the same 
string object. They're just written differently as source code.

Now, in regular expressions, the RE engine expects to see special codes 
inside the string that have special meanings. For example, backslash 
followed by lowercase B has a special meaning. So to create a string 
containing that regex, you can use any of the above (or any of the 
others). The RE engine doesn't know, and can't know, how you generated 
the regex. All it sees is a string containing a backslash followed by 
lowercase-B.

But if you forget that Python uses backslash escapes in strings, and just 
write "\b", then the compiler creates the string chr(8) (BEL), which has 
no special meaning to the RE engine.


-- 
Steven



More information about the Python-list mailing list