Вы видите непечатаемые символы, потому что \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'
Он не выходит как «xMain». Он выходит как «xMain», а затем пробел, за которым следуют три непечатаемых символа. –