python - "ValueError: Unsupported format character ' "' (0x22) 在...”在 Python/字符串

标签 python regex string list

我见过几个类似的线程,但尝试转义字符对我不起作用。

简而言之,我有一个字符串列表,我正在对其进行迭代,因此我的目标是构建一个查询,将列表中的许多字符串合并到“选择,喜欢”查询中。

这是我的代码(Python)

def myfunc(self, cursor, var_list):
   query = "Select var FROM tble_tble WHERE"
   substring = []
   length = len(var_list)
   iter = length

   for var in var_list:
      if (iter != length):
         substring.append(" OR tble_tble.var LIKE %'%s'%" % var)
      else:
         substring.append(" tble_tble.var LIKE %'%s'%" % var)
      iter = iter - 1

   for str in substring:
      query = query + str
...

这应该够了。如果从我之前陈述的声明中看不出来,我正在尝试构建一个查询来运行 SQL“LIKE” 列表 相关字符串。

感谢您抽出时间,如有任何问题,请随时提出。

最佳答案

首先,你的问题与SQL无关。扔掉所有与 SQL 相关的代码并执行此操作:

var = 'foo'
" OR tble_tble.var LIKE %'%s'%" % var

你会得到同样的错误。这是因为您正在尝试使用包含杂散 % 符号的字符串进行 % 格式化。因此,它试图找出如何处理 %',但失败了。


你可以像这样避开这些杂散的 % 标志:

" OR tble_tble.var LIKE %%'%s'%%" % var

但是,这可能不是您想要做的。


首先,考虑使用 {}-formatting 而不是 %-formatting,尤其是当您尝试使用 % 个字符。它避免了转义它们的需要。所以:

" OR tble_tble.var LIKE %'{}'%".format(var)

但是,更重要的是,您根本不应该进行这种格式化。不要将值格式化为 SQL 字符串,只需将它们作为 SQL 参数传递即可。如果您使用的是 sqlite3,请使用 ? 参数标记;对于 MySQL,%s;对于不同的数据库,请阅读其文档。所以:

" OR tble_tble.var LIKE %'?'%"

这里没有什么可以出错的,也没有什么需要逃避的。当您使用查询字符串调用 execute 时,将 [var] 作为参数传递。

这要简单得多,而且通常速度更快,并且巧妙地避免了很多处理边缘情况的愚蠢错误,而且最重要的是,它可以防止 SQL 注入(inject)攻击。

sqlite3 docs更详细地解释一下:

Usually your SQL operations will need to use values from Python variables. You shouldn’t assemble your query using Python’s string operations… Instead, use the DB-API’s parameter substitution. Put ? as a placeholder wherever you want to use a value, and then provide a tuple of values as the second argument to the cursor’s execute() method. (Other database modules may use a different placeholder, such as %s or :1.) …


最后,正如其他人在评论中指出的那样,对于 LIKE 条件,您必须将百分号放在引号内部,而不是外部。所以,无论你用哪种方式解决这个问题,你都会有另一个问题需要解决。但是那一个应该容易得多。 (如果没有,您随时可以回来问另一个问题。)

关于python - "ValueError: Unsupported format character ' "' (0x22) 在...”在 Python/字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18002643/

相关文章:

python - 使用小版本特性时如何写shebang

r - 创建具有多个分隔符的两列

java - 用正则表达式解析pl/sql,需要去掉文字

ruby - 保存字符串的某一段

python - 如何阻止 python 程序可执行文件打开 cmd shell?

python - pygame中物体的速度?

python - 愚蠢的问题 : Is there a way to make a color pattern repeat every X number of LEDs? 或者我是否必须为 strip 中的每个 LED 写出模式?

javascript - 如何提取正则表达式中由单词后跟分号分隔的句子?

python - 索引到列表中的字符串

javascript - 用不同的参数替换图像源字符串的后部