Зачем использовать re.match(), когда re.search() может делать то же самое?

Из документации ясно видно, что:

  • match() → применить соответствие шаблону в начале строки
  • search() → искать строку и возвращать первое соответствие

И search с '^' и без re.M флаг будет работать так же, как match.

Тогда почему у python есть match()? Разве это не избыточно? Есть ли какие-либо преимущества в производительности для match() в python?

Ответы

Ответ 1

"Почему" вопросы трудно ответить. На самом деле вы можете определить функцию re.match() следующим образом:

def match(pattern, string, flags):
    return re.search(r"\A(?:" + pattern + ")", string, flags)

(поскольку \A всегда совпадает в начале строки, независимо от состояния флага re.M).

Итак re.match - полезный ярлык, но не обязательно. Это особенно смущает программистов Java, у которых Pattern.matches(), который привязывает поиск к началу и концу строки (что, вероятно, является более распространенным вариантом использования, чем просто привязка к началу).

Это различно для методов match и search объектов регулярных выражений, однако, как указал Эрик.

Ответ 2

Аргумент pos ведет себя по-разному важными способами:

>>> s = "a ab abc abcd"
>>> re.compile('a').match(s, pos=2)
<_sre.SRE_Match object; span=(2, 3), match='a'>
>>> re.compile('^a').search(s, pos=2)
None

match позволяет писать токенизатор и гарантировать, что символы никогда не пропущены. search не может сказать "начать с самого раннего допустимого символа".

Пример использования совпадения для разбиения строки без пробелов:

def tokenize(s, patt):
    at = 0
    while at < len(s):
        m = patt.match(s, pos=at)
        if not m:
            raise ValueError("Did not expect character at location {}".format(at))
        at = m.end()
        yield m