[英]Python unicode escape for RethinkDB match (regex) query
我正在嘗試使用轉義的 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”,然后匹配它們,因此第一個查詢可以工作,即使它看起來像字符串中的 unide 匹配。
從表面上看,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 一起使用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.