Сопоставление шаблонов Python

#python

#python

Вопрос:

В настоящее время я застрял в попытке создать наивный алгоритм, который, учитывая фрагмент шаблона, например aabba, ищет его в тексте, например abbbbaababaabbaabbaabbaa по одной букве за раз. Он сравнит a с текстом, если это правильно, затем сравнивает следующую букву, и если это неправильно, весь шаблон сдвинется на единицу и сравнит a с b и т.д.

мы приводили пример кода

 print "Input text: ",
text = raw_input()
print "Input pattern: ",
pattern = raw_input()

index = text.find(pattern)
while index > -1:
    print index
    index = text.find(pattern, index 1)
  

но функция find () в python слишком быстрая (мне нужен неоптимизированный алгоритм, использующий while
и для операторов loops, я думаю).

Любая помощь приветствуется, спасибо

Комментарии:

1. Это домашнее задание? Если да, пожалуйста, пометьте это как таковое.

2. подождите, что означает «слишком быстро»?

3. Звучит так, как будто он должен пройти через это посимвольно сам

Ответ №1:

Я думаю, вот что вам нужно, следующий код выполняет сравнение посимвольно. Вы также можете заменить вызовы на find повторениями text , которые включают проверку того, text совпадает ли первый символ с первым символом pattern :

 def my_find(text, pattern):
    '''Find the start index of a pattern string in a text.
    Return -1 if not found, and assume that pattern is not empty'''

    found = False
    current_start_index = text.find(pattern[0])
    index_text = current_start_index
    index_pattern = 0

    while not found and index_text   len(pattern) - 1 < len(text) and 
            current_start_index != -1:

        index_text  = 1
        index_pattern  = 1

        while index_text < len(text) and 
                index_pattern < len(pattern) and 
                text[index_text] == pattern[index_pattern]:

            if index_pattern == len(pattern) - 1:
                found = True
                break
            else:
                index_text  = 1
                index_pattern  = 1

        if not found:
            current_start_index = text.find(pattern[0],current_start_index   1)
            index_text = current_start_index

    if found:
        return current_start_index
    else:
        -1
  

Ответ №2:

 def my_find(haystack, needle):
    n_len = len(needle)
    start = 0
    while start <= (len(haystack)-n_len 1):
        if haystack[start:start n_len-1] == needle:
            return True
        start  = 1
  

Это, насколько я могу понять, ваш алгоритм. Не тестировалось, протестируем и сообщим вам, работает ли это.

Протестировано и, похоже, работает.

Комментарии:

1. Просто чтобы указать, перебор списков или массивов и т.д. — это худшее, что вы можете сделать в python. Снижение производительности значительно по сравнению с C или C . Кроме того, вы хотели бы использовать регулярные выражения для выполнения этих типов сопоставления, чтобы уберечься от ошибок, отдельных ошибок и т.д….

Ответ №3:

Похоже, вы изучаете регулярные выражения, вот фрагмент, который может помочь вам начать.

 myFileName = "abbababaaa"
patternToMatch = "ababa"

i = 0
j = 0
while (i < len(myFileName)):
    if (patternToMatch[i:i] == myFileName[j:j]):
        i  
        j  
    else:
        i = 0        

if len(patternToMatch) == i:
    # matched a pattern
  

Комментарии:

1. -1 Он предполагал просмотреть его последовательно в теге homework

2. Обратите внимание на название…. Сопоставление шаблонов Python. Это означало бы, что регулярное выражение было бы приемлемым. Вы, безусловно, можете сопоставлять отдельные символы с регулярным выражением. Но, если вы собираетесь выполнять итерации по массивам или строкам, тогда используйте C или C

3. Если вы прочитаете вопрос, там говорится, что он хочет сделать это посимвольно, и это не то, что делает регулярное выражение, это просто поиск результатов, и он на самом деле не пишет «алгоритм»

4. Вы могли бы сделать это так же легко на C , используя substr

5. Боюсь, он хотел бы использовать python.