python - 用于 RethinkDB 匹配(正则表达式)查询的 Python unicode 转义
问题描述
我正在尝试使用转义的 unicode 用户提供的搜索参数执行 rethinkdb 匹配查询:
import re
from rethinkdb import RethinkDB
r = RethinkDB()
search_value = u"\u05e5" # provided by user via flask
search_value_escaped = re.escape(search_value) # results in u'\\\u05e5' ->
# when encoded with "utf-8" gives "\ץ" as expected.
conn = rethinkdb.connect(...)
results_cursor_a = r.db(...).table(...).order_by(index="id").filter(
lambda doc: doc.coerce_to("string").match(search_value)
).run(conn) # search_value works fine
results_cursor_b = r.db(...).table(...).order_by(index="id").filter(
lambda doc: doc.coerce_to("string").match(search_value_escaped)
).run(conn) # search_value_escaped spits an error
search_value_escaped 的错误如下:
ReqlQueryLogicError: Error in regexp `\ץ` (portion `\ץ`): invalid escape sequence: \ץ in:
r.db(...).table(...).order_by(index="id").filter(lambda var_1: var_1.coerce_to('string').match(u'\\\u05e5m'))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
我尝试在 re.escape() 之前/之后使用“utf-8”进行编码,但结果相同但错误不同。我在搞什么鬼?是我的代码中的某些东西还是某种错误?
编辑: .coerce_to('string') 将文档转换为“utf-8”编码字符串。RethinkDB 还将查询转换为“utf-8”,然后匹配它们,因此第一个查询有效,即使它看起来像字符串中的 unicde 匹配。
解决方案
从看起来 RethinkDB 拒绝转义的 unicode 字符的情况来看,所以我编写了一个简单的解决方法,其中包含自定义转义,而没有实现我自己的替换字符的逻辑(担心我必须错过一个并造成安全问题)。
import re
def no_unicode_escape(u):
escaped_list = []
for i in u:
if ord(i) < 128:
escaped_list.append(re.escape(i))
else:
escaped_list.append(i)
rv = "".join(escaped_list)
return rv
或单线:
import re
def no_unicode_escape(u):
return "".join(re.escape(i) if ord(i) < 128 else i for i in u)
这会产生转义“危险”字符所需的结果,并按照我的意愿与 RethinkDB 一起使用。
推荐阅读
- eclipse - 构建 Trace Compass 时出现 Maven 错误
- wildfly - 为什么包含在 Infinispan 的白名单中的类仍然会抛出错误“未注册编组器”?
- html - 防止所见即所得的源代码编辑器更改所有网站
- mysql - 在多对多关系中选择特定属性
- node.js - NestJS nodejs在一个带有关系的查询中加载嵌套评论?
- arrays - “预计解码数组
但在 swift 5 问题中找到了字典 - delphi - 如何取消最后一个 AT 命令(Delphi - TComport)?
- excel - 如何制作一个提取整列括号之间文本的excel脚本?
- shell - groovy函数中shell导出的环境变量无法使用
- c# - 如何通过 AddHTTPClient 在 SQLCLR 中添加命名的 HTTPClient?