【问题标题】:Replace a double backslash with a single backslash in a string in python用python中的字符串中的单个反斜杠替换双反斜杠
【发布时间】:2016-08-30 00:42:30
【问题描述】:

我知道该主题的变体已在其他地方讨论过,但其他线程都没有帮助。

我想将一个字符串从 python 交给 sql。但是,字符串中可能会出现撇号 (')。我想用反斜杠转义它们。

sql = "update tf_data set authors=\'"+(', '.join(authors).replace("\'","\\\'"))+"\' where tf_data_id="+str(tf_data_id)+";"

但是,这将始终在我的字符串中给出\\'。因此反斜杠本身被转义,sql语句不起作用。

有人可以帮助我或给我一个替代方法吗? 谢谢

【问题讨论】:

  • 提供你想发送到sql的原始字符串
  • 您是否考虑过使用准备好的语句?
  • 您可以使用占位符,根本不需要任何转义。作为奖励,如果转义忽略了某些东西,您不会打开自己进行 SQL 注入。

标签: python str-replace pymysql


【解决方案1】:

别这样。
也不要连接 sql 查询,因为这些很容易发生 sql 注入。

改为使用参数化查询:

sql = "update tf_data set authors=%(authors)s where tf_data_id=%(data_id)s"
# or :authors and :data_id, I get confused with all those sql dialects out there


authors = ', '.join(authors)
data_id = str(tf_data_id)

# db or whatever your db instance is called
db.execute(sql, {'authors': authors, 'data_id': data_id})

【讨论】:

  • 谢谢,这非常接近我的需要。我只收到以下错误消息: ValueError: unsupported format character ';' (0x3b) 在索引 66
  • @MaxS 你是不是把最后一个s 打错了?同时将 ; 完全删除,因为它不需要。
  • @MaxS 是的,没有';'应该可以工作到底。我将从我的答案中删除它。
【解决方案2】:

您正在使用双引号字符串,但仍在转义其中的单引号。这不是必需的,您只需将要在替换操作中使用的反斜杠转义即可。

>>> my_string = "'Hello there,' I said."
>>> print(my_string)
'Hello there,' I said.
>>> print(my_string.replace("'", "\\'"))
\'Hello there,\' I said.

请注意,我正在使用打印。如果您只是要求 Python 在替换操作后向您显示字符串的表示形式,您会看到双反斜杠,因为它们需要被转义。

>>> my_string.replace("'", "\\'")
"\\'Hello there,\\' I said."

【讨论】:

  • 打印的问题是sql语句不会打印,所以sql也会看到双反斜杠
  • 不,不会的。该字符串不包含两个反斜杠。 '\\' 是一个只有一个反斜杠的字符串。
  • 在说sql会做什么之前你试过了吗? :) (哦,马蒂亚斯更快)
  • 正如 Matthias 所指出的,您将 Python 对包含转义字符的字符串的内部表示与字符串实际包含的内容混淆了。正如@DeepSpace 非常正确地发布的那样,手动构建这样的查询无论如何都是一个非常糟糕的主意。但恕我直言,理解这种区别仍然很重要。
【解决方案3】:

正如其他人所暗示的,如果您使用 python 包执行 SQL,请使用提供的方法和参数占位符(如果可用)。

我的回答解决了提到的转义问题。 使用带前缀 r

的字符串文字
print(r"""the\quick\fox\\\jumped\'""")

输出:

the\quick\fox\\\jumped\'

【讨论】:

  • 如果我打印我的字符串,它会给出我想要的样子。但是,我将把它添加到另一个字符串中并交给 sql。打印在这种情况下不起作用
  • 打印 r"""the\quick\fox\\\jumped\'""" + r"""\addition\\\"""" 输出:the\quick\fox\\ \跳\'\加法\\\"
  • 另外,您从未说过“将其交给 sql”部分是什么。你用的是 mysql 包吗?直接在命令行上执行?您的问题中没有明确说明您的确切输入和预期输出,因此任何人都很难回答您的问题。
  • 我认为这是我的错误的一部分:我已经用 pymysql 状态 .execute(sql) 尝试过,但我遇到了错误。之后,我将输出放在控制台中以尝试语句,而不会遇到 python-mysql 通信问题。我可能通过这种测试方式产生了我的问题
猜你喜欢
  • 1970-01-01
  • 2013-06-24
  • 2012-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-07
  • 1970-01-01
相关资源
最近更新 更多