2013-11-12 3 views
0

У меня есть следующие строки:Использование Python 2.7 регулярное выражение для замены части строки

b = re.sub('^xMain (\S+)/y1,/y0 (\S+)(.*)$', 'xMain \2\1\3', a) 

где а:

xMain Buchan/y1,/y0 Angus Sub1 

Почему b выйдет в 'xMain \x02\x01\x03'? Мое намерение - деинвертировать имя. В Regexbuddy это работает нормально, но не в Python 2.7.

+0

Он не выходит как «xMain». Он выходит как «xMain», а затем пробел, за которым следуют три непечатаемых символа. –

ответ

2

Вы видите непечатаемые символы, потому что \2\1\3 имеют смысл в регулярных питона строки тоже, как восьмеричные коды эвакуации:

>>> '\2' 
'\x02' 
>>> 'xMain \2\1\3' 
'xMain \x02\x01\x03' 

Они никогда не делают его функцию re.sub(), как написано.

Используйте необработанный строковый литерал вместо:

b = re.sub('^xMain (\S+)/y1,/y0 (\S+)(.*)$', r'xMain \2\1\3', a) 

Обратите внимание на r'...' строку. В качестве исходного строкового литерала \... символьные коды не интерпретируются, оставляя обратные ссылки на место для re модуля для использования:

>>> r'xMain \2\1\3' 
'xMain \\2\\1\\3' 

Альтернативой было бы удвоить обратный слэш, спасаясь побег:

b = re.sub('^xMain (\S+)/y1,/y0 (\S+)(.*)$', 'xMain \\2\\1\\3', a) 

в любом случае, ваш шаблон замены теперь работает, как ожидалось:

>>> import re 
>>> a = 'xMain Buchan/y1,/y0 Angus Sub1' 
>>> re.sub('^xMain (\S+)/y1,/y0 (\S+)(.*)$', r'xMain \2\1\3', a) 
'xMain Angus BuchanSub1' 
Смежные вопросы