2016-01-12 1 views
-2

Отладка следующей проблемы, проблемы с сообщением и ссылкой на код Я отлаживаю. Мой вопрос: я думаю, что если условие проверяется, если не нужно, и может быть безопасно удалено? Если я ошибаюсь, пожалуйста, не стесняйтесь меня исправлять. Благодарю.алгоритм строкового совпадения код для консультации

if len(first) > 1 and first[0] == '*' and len(second) == 0: 
    return False 

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

* --> Matches with 0 or more instances of any character or set of characters. 
? --> Matches with any one character. 

Например, g*ks матчей с geeks матчем. И строка ge?ks* соответствует geeksforgeeks (примечание * в конце первой строки). Но g*k не соответствует gee как символ k нет в второй строке.

# Python program to match wild card characters 

# The main function that checks if two given strings match. 
# The first string may contain wildcard characters 
def match(first, second): 

    # If we reach at the end of both strings, we are done 
    if len(first) == 0 and len(second) == 0: 
     return True 

    # Make sure that the characters after '*' are present 
    # in second string. This function assumes that the first 
    # string will not contain two consecutive '*' 
    if len(first) > 1 and first[0] == '*' and len(second) == 0: 
     return False 

    # If the first string contains '?', or current characters 
    # of both strings match 
    if (len(first) > 1 and first[0] == '?') or (len(first) != 0 
     and len(second) !=0 and first[0] == second[0]): 
     return match(first[1:],second[1:]); 

    # If there is *, then there are two possibilities 
    # a) We consider current character of second string 
    # b) We ignore current character of second string. 
    if len(first) !=0 and first[0] == '*': 
     return match(first[1:],second) or match(first,second[1:]) 

    return False 

спасибо заранее, Лина

+0

BTW, я не знаю, что не так с моим форматом, я отмечаю свой код как исходный код с помощью скобок, но, похоже, 3 строки «Программа Python соответствует символам wild card» Основная функция, которая проверяет наличие двух заданных строк совпадение. Первая строка может содержать подстановочные знаки «неправильно отображаются в правильном формате. Если кто-то может помочь взглянуть, это будет здорово. Благодарю. –

+3

FYI, похоже, вы пытаетесь выполнить рутинное манипулирование. Возможно, взгляните на модуль '' fnmatch' (сокращение от имени файла) ') (https://docs.python.org/3/library/fnmatch.html), который уже делает это? Или, если вы действительно просматриваете файловую систему, используйте модуль '' glob' (https://docs.python.org/3/library/glob.html)? – ShadowRanger

+1

Кроме того, для отслеживания ['fnmatch' реализован в Python, никаких специальных ускорителей] (https://hg.python.org/cpython/file/3.5/Lib/fnmatch.py), поэтому вы можете просто скопировать и измените его, если вам нужно обрабатывать только '*' и '?', но не подстановочные знаки класса символов. – ShadowRanger

ответ

1

Это if утверждение имеет решающее значение для правильной работы функции. Устранение этого будет иметь катастрофические последствия.

Например, предположим, что first="*a" и second="". Другими словами, эту функцию называли match("*a",""). Тогда оператор if заставит функцию вернуть False (это верно, поскольку в second нет a). Без if заявления, код переходит к линии

return match(first[1:],second) or match(first,second[1:]) 

Вызов match(first[1:],second) будет оценивать в match("a",""), который будет возвращать False. Но когда код вызывает match(first,second[1:]), вызов эквивалентен match("*a",""), а результат - бесконечная рекурсия.

+1

Но будет ли такая бесконечная рекурсия заставлять мой дом взорваться или моя улица наводнить? :) –

+1

@ N.Wouda Ну, если бесконечная рекурсия заставляет ваш компьютер потреблять больше энергии и что перегружает местный силовой трансформатор, приводя к пожару, а пожарный автомобиль случайно ударяет пожарного гидранта, тогда да, ваш дом может поймать в огне и наводнениях одновременно. – user3386109

+0

Спасибо за совет user3386109, отметьте свой ответ как ответ. :) –

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