我正在尝试解密一些文本,并希望为此编写一个Python脚本。 文本加密的方式是每个字母都映射到字母表中的字母。我想尝试将大词与英文单词列表匹配,因为我认为它们的可能性很小。
我的问题是,如何检查单词是否与ABCB之类的模式匹配。所以前三个字母不同,但最后一个字母与第四个字母相同。这里有可能。我尝试使用正则表达式,但我无法想出一个正则表达式,这个单词的长度为n。有人有建议吗?
编辑:我被要求更多地解释这种模式。在上面的示例中,每个字母都映射到字母表中的字母。所以A映射到一个字母,B映射到另一个字母,C映射到另一个字母,最后一个B映射到与第一个字母相同的字母。因此模式告诉您哪些字母是相同的,哪些是不同的。上面的模式表示前三个字母不同(A,B和C不同),最后一个字母与第二个字母相同(因为它们都是B)。 'We'将是一个解决方案,因为A将映射到w,B将映射到e,C将映射到r。
答案 0 :(得分:3)
这里提供了一些概念验证代码,用于将您的格式转换为其模式。 (我没有考虑到效率,只有清晰度)。
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)
。