使用 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 lookbehind 和 lookahead 断言。
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'
我需要使用 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 lookbehind 和 lookahead 断言。
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'