«r» означает, что следующее является «необработанной строкой», т.е. Символы обратной косой черты обрабатываются буквально, а не означают специальную обработку следующего символа.
http://docs.python.org/reference/lexical_analysis.html#literals
так '\n'
- это одна новая строка
и r'\n'
- это два символа - обратный слеш и буква 'n'
другой способ написать это будет '\\n'
, потому что первый обратный слеш экранирует второй
эквивалентный способ написания этого
print (re.sub(r'(\b\w+)(\s+\1\b)+', r'\1', 'hello there there'))
есть
print (re.sub('(\\b\\w+)(\\s+\\1\\b)+', '\\1', 'hello there there'))
Из-за того, как Python обрабатывает символы, которые не являются допустимыми управляющими символами, не все эти двойные обратные слэши необходимы - например, '\s'=='\\s'
, однако это не так для '\b'
и '\\b'
. Я предпочитаю быть явным и удваивать все обратные слеши.