匹配固定长度的单词与已知的未知字符顺序

时间:2013-03-26 12:01:26

标签: python regex

我正在尝试使用密文,我不知道这些字符是什么,但我确实知道语言,每个单词的长度以及所有字符的位置。

文中的一个词是“avarrm”,所以我希望我可以遍历单词词典,并尝试仅匹配第一个位置的字符与第三个字符中的字符相同的字词。位置,第4位的字符与第5位的字符相同,其余字符不是这两个字符中的任何一个或相同。

这听起来像是一个正则表达式的工作,但我完全不知道如何写它。这是可行的,如果是的话,怎么样?或者我应该忘记正则表达式并使用一堆ifs来做它?

2 个答案:

答案 0 :(得分:4)

这可能是必需的:

^(.).\1(.)\2((?!(\1|\2)).)*$

(.).\1(.)\2匹配一个字符,后跟一个字符后跟一个字符,后跟两个相同的字符。

((?!(\1|\2)).)*匹配零个或多个字符,既不是第一个字符也不是第四个字符。

这是你的要求吗?

修改

这个将确保最后一部分不会有重复的字符:

^(.).\1(.)\2((?!(.).*\4)(?!(\1|\2)).)*$

对于第二个不重复的角色,请使用:

^(.)((?!\1).)\1((?!(\1|\2)).)\3((?!(.).*\6)(?!(\1|\2|\3)).)*$

答案 1 :(得分:0)

另一种方法可能是将字符串转换为数字序列:

str1 = 'avarrm'
str2 = 'lylbbn'

def num_sequence(str_arg):
    return [dict(zip(str_arg, range(len(str_arg))))[n] for n in str_arg]

print num_sequence(str1), num_sequence(str2)

将输出

[0,3,2,3,5,5] [0,3,2,3,5,5]

由于列表相同,'lylbbn'是候选解决方案。