Зачем использовать 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