2013-04-30 2 views
0

Так что это не работает с регулярным выражением питона:re.sub пытается избежать замены строки?

>>> re.sub('oof', 'bar\\', 'foooof') 

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "C:\Python27\lib\re.py", line 151, in sub 
    return _compile(pattern, flags).sub(repl, string, count) 
    File "C:\Python27\lib\re.py", line 270, in _subx 
    template = _compile_repl(template, pattern) 
    File "C:\Python27\lib\re.py", line 257, in _compile_repl 
    raise error, v # invalid expression 
error: bogus escape (end of line) 

Я думал, что мои глаза обманывают меня, так что я сделал это:

>>> re.sub('oof', "bar\x5c", 'foooof') 

Получили то же самое. Я искал и подтвердил, что у людей есть эта проблема. Так в чем проблема с обработкой repl как обычной строки? Существуют ли дополнительные параметры форматирования, которые могут быть помещены в repl?

ответ

2

Да, строка замены обрабатывается для символов эвакуации. От the docs:

repl может быть строкой или функцией; если это строка, обрабатывается любая обратная косая черта . То есть \ n преобразуется в один символ новой строки , \ r преобразуется в возврат каретки и т. Д. Неизвестные escape-последовательности, такие как \ j, остаются в силе. Обратные ссылки, такие как \ 6, , заменяются подстрокой, соответствующей группе 6 в шаблоне.

+0

Ой, я, должно быть, не обратил на это внимания. Так что да, есть дополнительное форматирование в repl. Ухоженная. – chaz

2

Используйте сырые строки:

re.sub('oof', r'bar\\', 'foooof') 

без префикса r, вы должны иметь двойные сбежавшие обратные слэша:

re.sub('oof', 'bar\\\\', 'foooof') 
+0

Нет, я имею в виду, почему же мне нужно избежать обратных косых строк замены? Почему есть дополнительная обработка для замены строки - это то, о чем я прошу. Разве он не должен заменять соответствующие сегменты тем, что 'repl' есть и не задавать вопросы? – chaz

-1

Ожидал foobar\ как выход? Если это так, re.sub('oof', r'bar\\', 'foooof') - это то, что вам нужно; r сообщает Python рассматривать то, что следует за необработанной строкой, и поэтому обратные косые черты рассматриваются как обратная косая черта вместо того, чтобы работать как знак того, что следующий символ нужно обрабатывать специально. Here - это раздел в документации, который объясняет это более подробно.

1

Если вы не хотите строку ускользает быть обработан, вы можете использовать лямбда и строка не обрабатывается:

>>> re.sub('oof', lambda x: 'bar\\', 'foooof') 
'foobar\\' 
>>> s=re.sub('oof', lambda x: 'bar\\', 'foooof') 
>>> print s 
foobar\ 

Но он все равно будет интерпретироваться при печати:

>>> re.sub('oof', lambda x: 'bar\r\\', 'foooof') 
'foobar\r\\' 
>>> print re.sub('oof', lambda x: 'bar\r\\', 'foooof') 
\oobar 

Или используйте сырую строку:

>>> re.sub('oof', r'bar\\', 'foooof') 
'foobar\\' 
+0

Это было в пидоках, я должен читать лучше. Мне нравится этот вариант, а не побег. – chaz