我正在尝试解密一些文本,并想为此编写一个 Python 脚本。
文本加密的方式是每个字母映射到字母表中的一个字母。我想尝试将大单词匹配到英文单词列表,因为我认为它们的可能性很小。
我的问题是,如何检查单词是否与 ABCB 这样的模式匹配。所以前三个字母不同,但最后一个字母与第四个相同。我们在这里有可能。我尝试使用正则表达式,但我想不出一个正则表达式来处理长度为 n 的单词。有人有建议吗?
编辑:我被要求多解释一下模式。在上面的示例中,每个字母都映射到字母表中的一个字母。所以 A 映射到一个字母,B 映射到另一个字母,C 又映射到另一个字母,最后一个 B 映射到与第一个 B 相同的字母。所以模式告诉你哪些字母相同,哪些不同。上面的模式表示前三个字母不同(A、B 和 C 不同),最后一个字母与第二个字母相同(因为它们都是 B)。 "is"将是一个解决方案,因为 A 将映射到 w,B 将映射到 e,C 将映射到 r。
这里有一些概念验证代码,用于将单词转换为您建议的格式中的模式。 (我没有考虑效率,只考虑清晰度)。
import string
def word_to_pattern(word):
# Stores actual-letter to pattern-placeholder mapping
mapping = {}
# ZYXW... so we cap pop letters starting with A from the end
available_pattern_letters = list(string.ascii_uppercase)[::-1]
pattern = []
for letter in word.upper():
if letter not in string.ascii_uppercase:
# for punctuation etc
pattern.append(letter)
continue
if letter not in mapping:
# new letter we haven't seen yet in this word
mapping[letter] = available_pattern_letters.pop()
pattern.append(mapping[letter])
return pattern.join("")
然后只需检查是否 word_to_pattern(a) == word_to_pattern(b)
即可。