gpt4 book ai didi

RethinkDB 匹配(正则表达式)查询的 Python unicode 转义

转载 作者:行者123 更新时间:2023-12-01 08:08:07 25 4
gpt4 key购买 nike

我正在尝试使用转义的 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 一起使用。

关于RethinkDB 匹配(正则表达式)查询的 Python unicode 转义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55433603/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com