Как заменить двойную обратную косую черту sh на одну обратную косую черту - PullRequest
0 голосов
/ 27 февраля 2020

многие из выводов относятся к python2, мой случай python3:

Мне нужно заменить двойной задний лист sh на единственный задний лист sh

a = 'RXIE-SERVER\\MSSQLSERVER_NEW'

«принятый ответ» из этого поста python3 замена двойного бэсла sh на один бэсла sh здесь не работает:

enter image description here

Так в чем здесь проблема? Большое спасибо.

[ОБНОВЛЕНИЕ]:

Благодаря ответу @ ShadowRanger, поэтому, если вы напечатаете строку после операции замены, она будет работать ожидаемым образом, однако, в моем случае мне нужно конкатить пост-замену, чтобы сгенерировать другую переменную (conn_str), как вы можете видеть, она по-прежнему показывает двойной backsla sh.

Любая подсказка для обходного пути?

Большое спасибо.

server = str.replace(data['server'], "\\\\", "\\")
database = data['database']
driver = data['driver']
auth = data['auth']

conn_str = "DRIVER={" + driver + "}; SERVER=" + server + "; Database=" + database + ";" + auth

enter image description here

1 Ответ

3 голосов
/ 27 февраля 2020
a = 'RXIE-SERVER\\MSSQLSERVER_NEW'

не имеет двойной бэкслы sh. У него есть экранированный одиночный backsla sh, просто безопаснее (и в конечном итоге потребуется) его избежать, поэтому Python не думает, что \M - это попытка выхода из строки. Если вы сделаете:

print(a)

, вы увидите, что он печатает только один backsla sh (потому что print выводит необработанные данные, не показывая экранирования).

Причина a.replace('\\', '') не работает, потому что он заменил одиночную обратную косую черту sh ничем (и это сделало бы это для всех обратных косых черт); a.replace('\\\\', '\\') не работает, потому что '\\\\' представляет действительную удвоенную обратную косую черту sh, и у вас ее нет.

Если ваш входной сигнал поступил из какого-то другого источника (не литерала, который вы описали ) и на самом деле имеет удвоенную обратную косую черту sh, тогда a.replace('\\\\', '\\') фактически работает, но REPL повторяет repr объекта, а для str это означает добавление обратной косой черты sh чтобы сделать его легальным, эквивалентным str литералом, он выглядел как двойной бэкслла sh, но имел только один. Если вы измените >>> a.replace('\\\\', '\\') на >>> print(a.replace('\\\\', '\\')) (который печатает удобную для человека форму, а не repr), вы увидите, что он отображает только одну обратную косую черту sh.

Если вы не Не похоже на то, как это выглядит в вашем коде, используйте необработанные строки, чтобы убрать необходимость в escape:

a = r'RXIE-SERVER\MSSQLSERVER_NEW'
#   ^ note prefix that makes it raw
...