2

私は、文字が何であるかわからない暗号文をブルートフォースしようとしていますが、言語、各単語の長さ、およびすべての文字の位置は知っています。

本文中の単語の1つが「avarrm」なので、単語の辞書をループして、最初の位置の文字が3番目の位置の文字と同じであるものだけを一致させてみることを望んでいました。 4番目の位置の文字は5番目の位置の文字と同じですが、残りの文字はこれら2つの文字のどちらでもないか、互いに同じではありません。

正規表現の仕事のように聞こえますが、どうやってそれを書くのか全くわかりません。これは実行可能ですか?実行可能な場合、どのように実行しますか?それとも、正規表現を忘れて、たくさんのifでそれを行う必要がありますか?

4

2 に答える 2

4

これは必要なものかもしれません:

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

(.).\1(.)\2文字の後に1つの文字が続き、最初の文字の後に2つの同一の文字が続くのと同じ文字に一致します。

((?!(\1|\2)).)*最初の文字でも4番目の文字でもない0個以上の文字に一致します。

これはあなたの要件ですか?

編集

これにより、最後の部分に繰り返し文字が含まれないようになります。

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

2番目の文字が繰り返されないようにするには、次を使用します。

^(.)((?!\1).)\1((?!(\1|\2)).)\3((?!(.).*\6)(?!(\1|\2|\3)).)*$
于 2013-03-26T12:16:15.533 に答える
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」がソリューションの候補です。

于 2013-03-26T13:30:59.670 に答える