2013-03-26 40 views
2

我試圖強制一個密文,我不知道任何字符是什麼,但我知道語言,每個長度單詞和所有角色的位置。匹配固定長度的單詞與已知的未知字符順序

正文中的一個單詞是「avarrm」,所以我希望能夠通過單詞詞典進行循​​環,並嘗試僅匹配第一個位置中的字符與第一個位置中的字符相同的單詞第三個位置,第四個位置的字符與第五個位置的字符相同,其餘的字符不是這兩個字符中的任何一個或彼此相同。

這聽起來像一個正則表達式的工作,但我絕對不知道如何去寫它。這是可行的,如果是的話,如何?或者我應該忘記正則表達式,並用一堆ifs來做這件事?

+0

當我們談論正則表達式時,請說明您使用的口味或語言:) – HamZa 2013-03-26 12:09:45

+0

Python會更好。 – 2013-03-26 12:12:59

+0

另一種方法是將字典中的字改爲「a」,將第一個字改爲「a」,將第二個字改爲「b」,如果與第一個字「a」不同,等等。 – 2013-03-26 12:34:45

回答

4

這可能是一個必需的:

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

(.).\1(.)\2一個字符接着一個字符接着一個與第一後跟兩個相同的字符相匹配。

((?!(\1|\2)).)*匹配零個或多個不是第一個字符或第四個字符的字符。

這是您的要求嗎?

編輯

這一次將確保最後不會有重複的字符:

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

對於第二個字符不是一個重複一次,使用:

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

讓我給你一個匹配字符串的例子:'abasso'。用這個正則表達式,它似乎不匹配。 – 2013-03-26 12:34:19

+0

@TommyBrunn它在我測試時匹配。 – 2013-03-26 12:36:59

+0

@TommyBrunn爲了在python中工作,你可能必須做必要的轉義和標記。我是新來的蟒蛇 – 2013-03-26 12:38:29

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'是候選解決方案。

相關問題