Замена текста на \n в нем реальным выводом \n
Я пытаюсь получить конфигурацию от маршрутизатора Juniper, и у меня есть следующая проблема:
После настройки этого
stdin, stdout, stderr = client1.exec_command('show configuration interfaces %s' % SID)
CONFIG = stdout.read()
print CONFIG
Это приносит мне что-то вроде этого
'description El_otro_Puerto_de_la_Routing-instance;\nvlan-id 309;\nfamily inet {\n mtu 1600;\n address 10.100.10.10/24;\n}\n'
и проблема в том, что я хочу получить эту информацию в этом формате:
'description El_otro_Puerto_de_la_Routing-instance;
nvlan-id 309;
nfamily inet {
mtu 1600;
address 10.100.10.10/24;
}
Поэтому я хочу, чтобы \ n была новой строкой, а не просто показывала мне строку "\n".
5 ответов
Если вы выполняете это в интерпретаторе Python, то обычное поведение интерпретатора - показывать новые строки в виде "\n" вместо реальных новых строк, потому что это облегчает отладку вывода. Если вы хотите получить настоящие переводы строк в переводчике, вам следует print
Строка, которую вы получите.
Если это то, что выводит программа (т.е. вы получаете escape-последовательности новой строки из внешней программы), вы должны использовать следующее:
OUTPUT = stdout.read()
formatted_output = OUTPUT.replace('\\n', '\n')
print formatted_output
Это заменит экранированные символы новой строки фактическими символами новой строки в выходной строке.
В Python 3+ лучший способ интерпретировать все escape-символы:
print(f"{yourStringHere}")
Здесь используются f-строки, что, на мой взгляд, вероятно, является наиболее элегантным способом решения этой проблемы.
Регулярное выражение может помочь в поиске
\x
последовательности. Однако пары замещения все равно придется указывать вручную, как и в ответе @PedroCastilho .
import re
CONFIG = stdout.read()
print(re.sub(r'\\.',lambda x:{'\\n':'\n','\\t':'\t'}.get(x[0],x[0]),CONFIG))
Это заменит
\\n
-песок
\\t
-s с фактическими разрывами строк и табуляторами и оставляет неизвестные нетронутыми.
Нравиться
print(re.sub(r'\\.',lambda x:{'\\n':'\n','\\t':'\t'}.get(x[0],x[0]),
'foo\\nbar\\nbaz\\tbrr\\n\\q'))
отпечатки
foo bar baz brr \q
Итак, разрывы строк и табулятор на месте, и
\q
просто выжил.
Альтернативой тому, что вы хотите, является разбиение вашей строки на список строк (для каждой строки).
>>> mystr = 'a\nb\nc'
>>> mystr = mystr.split(sep='\n')
>>> print(mystr)
['a', 'b', 'c']
>>> for s in mystr:
print(s)
a
b
c