在Python中将单词与模式匹配

时间:2017-02-08 23:37:53

标签: python regex design-patterns

我正在尝试解密一些文本,并希望为此编写一个Python脚本。 文本加密的方式是每个字母都映射到字母表中的字母。我想尝试将大词与英文单词列表匹配,因为我认为它们的可能性很小。

我的问题是,如何检查单词是否与ABCB之类的模式匹配。所以前三个字母不同,但最后一个字母与第四个字母相同。这里有可能。我尝试使用正则表达式,但我无法想出一个正则表达式,这个单词的长度为n。有人有建议吗?

编辑:我被要求更多地解释这种模式。在上面的示例中,每个字母都映射到字母表中的字母。所以A映射到一个字母,B映射到另一个字母,C映射到另一个字母,最后一个B映射到与第一个字母相同的字母。因此模式告诉您哪些字母是相同的,哪些是不同的。上面的模式表示前三个字母不同(A,B和C不同),最后一个字母与第二个字母相同(因为它们都是B)。 'We'将是一个解决方案,因为A将映射到w,B将映射到e,C将映射到r。

1 个答案:

答案 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)