Алгоритм сравнения строк

Подскажите алгоритм который на вход получает строку и сравнивает ее с шаблоном, а потом выдает ответ true если строка и шаблон одинаковые и false если они разные. Спецсимволы используемые в шаблоне:

* - заменяем на любое количество символов, в том числе и 0 символов

? - заменяет только 1 символ.

Подойдет пример на любом языке, но лучше на питоне. Как могут выглядеть примеры решения:

print(match_pattern("abc", "a?"))  # Выведет False
print(match_pattern("abc", "ab?"))  # Выведет True
print(match_pattern("abc", "a?b"))  # Выведет False
print(match_pattern("abc", "???"))  # Выведет True
print(match_pattern("abc", "a?c"))  # Выведет True
print(match_pattern("abc", "a*"))  # Выведет True
print(match_pattern("abc", "ab*"))  # Выведет True
print(match_pattern("abc", "ab"))  # Выведет False
print(match_pattern("abc", "**"))  # Выведет True
print(match_pattern("abc", "ac"))  # Выведет False
print(match_pattern("abc", "ac*"))  # Выведет False

Вот к примеру так выглядит код обрабатывающий только вопрос

def match_pattern(input_string, pattern):
    # Функция для проверки соответствия строки шаблону
    def is_match(s, p):
        # Инициализация индексов для строк
        i, j = 0, 0
        n, m = len(s), len(p)
        super = False
        # Проверка каждого символа шаблона
        while j < m:
            if p[j] == '?' or s[i] == p[j]:
                i += 1
            else:
                return False
            j += 1
        return i == n

    # Возвращаем результат проверки соответствия всей строки шаблону
    return is_match(input_string, pattern)


Ответы (1 шт):

Автор решения: MBo

Вот, похоже, самое простое: https://docs.python.org/3/library/fnmatch.html

import fnmatch

print(fnmatch.fnmatch("abc", "a?"))  # Выведет False
print(fnmatch.fnmatch("abc", "ab?"))  # Выведет True
print(fnmatch.fnmatch("abc", "a?b"))  # Выведет False
print(fnmatch.fnmatch("abc", "ab*"))  # Выведет True
print(fnmatch.fnmatch("abc", "ac"))  # Выведет False
print(fnmatch.fnmatch("abc", "ac*"))  # Выведет False
→ Ссылка