使用 Python 从 URL 中选择性地编辑可变长度密钥

Selectively redact variable-length key from URL using Python

我需要使用 Python 从 URL 字符串中编辑可变长度密钥。除了密钥的最后四个字符外,其他所有字符都将被编辑。出于识别目的,密钥的最后四个字符将有意保持未编辑状态。密钥的字符集是 ASCII 字母数字。 URL 必须保持不受影响。用于密文 () 的字符是 unicodedata.lookup("FULL BLOCK").

示例输入:https://example.com/data?bar=irish&key=dc3e966e4c57effb0cc7137dec7d39ac.

示例输出:https://example.com/data?bar=irish&key=████████████████████████████39ac.

我正在使用 Python 3.8。存在一个涉及 的不同问题,它对我没有帮助。

我尝试了一个简单的正则表达式替换,但它只适用于固定长度的密钥,而我有一个可变长度的密钥。

一种灵活的方法是使用带有替换函数的正则表达式 substitution。正则表达式使用不匹配的 positive lookbehindlookahead 断言。

import re
import unicodedata

_REGEX = re.compile(r"(?<=\Wkey=)(?P<redacted>\w+)(?=\w{4})")
_REPL_CHAR = unicodedata.lookup("FULL BLOCK")


def redact_key(url: str) -> str:
    # Ref: 
    return _REGEX.sub(lambda match: len(match.groupdict()["redacted"]) * _REPL_CHAR, url)

测试:

redact_key('https://example.com/data?bar=irish&key=dc3e966e4c57effb0cc7137dec7d39ac')
'https://example.com/data?bar=irish&key=████████████████████████████39ac'

>>> redact_key('https://example.com/data?key=dc3e966e4c57effb0cc7137dec7d39ac')
'https://example.com/data?key=████████████████████████████39ac'

>>> redact_key('https://example.com/data?bar=irish&key=dc3e966e4c57effb0cc7137dec7d39ac&baz=qux')
'https://example.com/data?bar=irish&key=████████████████████████████39ac&baz=qux'

>>> redact_key('https://example.com/data?bar=irish&baz=qux')
'https://example.com/data?bar=irish&baz=qux'