2013-03-26 2 views
2

Я пытаюсь сделать грубую силу шифрованным текстом, где я не знаю, что у кого-либо из персонажей, но я знаю язык, длину каждого слова и позиции всех персонажей.Соответствующее слово фиксированной длины с известным порядком неизвестных символов

Одним из слов в тексте является «avarrm», поэтому я надеялся, что смогу прокрутить словарь слов и попытаться сопоставить только те, где символ в первой позиции совпадает с символом в третья позиция, а символ в 4-й позиции - тот же, что и в пятой позиции, причем остальные символы не являются ни одним из этих двух символов или одинаковыми друг с другом.

Это звучит как работа для регулярного выражения, но я совершенно не знаю, как я буду писать. Это выполнимо, и если да, то как? Или я должен забыть о регулярном выражении и сделать это с кучей ifs?

+0

Когда мы говорим о регулярном выражении, пожалуйста, укажите вкус или язык, который вы используете :) – HamZa

+0

Python предпочтительнее. –

+0

Альтернативным подходом было бы нормализовать словарные слова, меняющие первый символ на 'a', второй символ на' b', если он отличается от первого, 'a', и так далее. –

ответ

4

Это может потребоваться один:

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

(.).\1(.)\2 соответствует символ, за которым следует символ, затем один же, как и первый следуют два одинаковых символов.

((?!(\1|\2)).)* соответствует нулю или более символам, которые не являются ни первым, ни четвертым.

Это ваше требование?

EDIT

Это можно было бы гарантировать, что последняя часть не будет иметь повторяющиеся символы:

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

Для второго символа не будет повторяться один, используйте:

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

Позвольте мне привести пример строки, которая будет соответствовать: 'abasso'. С этим регулярным выражением он, похоже, не соответствует. –

+0

@TommyBrunn это совпадение, когда я тестировал. –

+0

@TommyBrunn Для работы в python вам, возможно, придется выполнять необходимые экранирование и помечать. Я новичок в python –

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 'является кандидатом на решение.

Смежные вопросы