【问题标题】:How to replace double backslash to single backslash如何将双反斜杠替换为单反斜杠
【发布时间】:2020-02-26 21:21:49
【问题描述】:

很多发现都是针对python2的,我的情况是python3:

我需要将双反斜杠替换为单反斜杠

a = 'RXIE-SERVER\\MSSQLSERVER_NEW'

此帖子python3 replacing double backslash with single backslash 的“已接受答案”在这里不起作用:

那么这里的问题是什么?非常感谢。

[更新]:

感谢@ShadowRanger 的回复,所以如果在替换操作后打印字符串,它可以正常工作,但是,在我的情况下,我需要连接替换后生成另一个变量(conn_str),如您所见,它仍然显示双反斜杠。

任何解决方法的线索?

非常感谢。

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

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

【问题讨论】:

标签: python python-3.x escaping


【解决方案1】:
a = 'RXIE-SERVER\\MSSQLSERVER_NEW'

没有双反斜杠。它有一个转义的单反斜杠,它只是更安全(并且最终会被要求)转义它,所以 Python 不认为 \M 是对字符串转义的尝试。如果你这样做:

print(a)

你会看到它只打印一个反斜杠(因为print 输出原始数据而不显示转义)。

a.replace('\\', '') 不起作用的原因是因为它用空替换了单个反斜杠(它会为所有反斜杠替换); a.replace('\\\\', '\\') 不起作用,因为 '\\\\' 代表实际的双反斜杠,而您没有任何这些。

如果您的输入来自其他来源(不是您描述的文字)并且 实际上 有一个双反斜杠,那么 a.replace('\\\\', '\\') 确实有效,但 REPL 会回显对象的 repr ,对于str,这意味着添加反斜杠转义以使其成为合法的、等效的str 文字,因此它看起来 像一个双反斜杠,但只有一个。如果您将>>> a.replace('\\\\', '\\') 更改为>>> print(a.replace('\\\\', '\\'))(它会打印人性化的表单,而不是repr),您会看到它只显示一个反斜杠。

如果您不喜欢它在代码中的外观,请使用原始字符串来消除对转义的需要:

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

【讨论】:

  • 谢谢,但很抱歉原始字符串是从其他地方生成的,我确实需要找到一种方法将双反斜杠替换为单反斜杠。
  • @mdivk:如果它实际上有一个双反斜杠,那么a.replace('\\\\', '\\') 代码确实有效。您只是不认为它确实如此,因为 REPL 的回显功能会回显对象的 repr,这会将生成的单个反斜杠显示为双反斜杠(因为它旨在成为合法的 str 文字,这需要额外的反斜杠作为转义)。将>>> a.replace('\\\\', '\\') 更改为>>> print(a.replace('\\\\', '\\')),您会发现它实际上只有一个反斜杠。
  • 谢谢@ShadowRanger,是的,我认为它没有完成,但实际上它完成了。我已经对我的 OP 进行了一些更新,但仍然不需要。
  • @mdivk:是的,这正是您所需要的。你又在看repr; Python 不会神奇地添加斜线。只要使用它,您会发现它的行为与您期望的完全一样。
  • 不,它没有。我将得到一个包含无法识别的服务器 RXIE-SERVER\\MSSQLSERVER_NEW 的连接字符串,我必须手动创建一个带有 RXIE-SERVER\MSSQLSERVER_NEW 的连接字符串,谢谢。
猜你喜欢
  • 2013-04-15
  • 2017-07-25
  • 2012-06-16
  • 2010-09-11
  • 1970-01-01
  • 1970-01-01
  • 2011-09-06
  • 2013-06-24
  • 1970-01-01
相关资源
最近更新 更多