簡體   English   中英

用於 RethinkDB 匹配(正則表達式)查詢的 Python unicode 轉義

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM