用python中的字符串中的单个反斜杠替换双反斜杠

时间:2016-05-04 14:01:56

标签: python str-replace pymysql

我知道这个主题的变体已在别处讨论过,但其他任何一个主题都没有用。

我想将一个字符串从python移交给sql。然而,可能会发生撇号(')出现在字符串中。我想用反斜杠逃避它们。

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

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

有人可以帮助我,或者让我替代我这样做的方式吗? 感谢

3 个答案:

答案 0 :(得分:6)

根本不这样做。
也不要连接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})

答案 1 :(得分: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."

答案 2 :(得分:0)

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

我的回答解决了提到的逃避问题。 使用前缀为r

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

输出:

the\quick\fox\\\jumped\'