В чем разница между re.search и re.match Python?

В чем разница между функциями search() и match() в модуле python re ?

Я прочитал документацию ( текущая документация ), но я никогда ее не помню. Я продолжаю искать и переучивать его. Я надеюсь, что кто-то ясно ответит на это примерами, чтобы (возможно) это застряло у меня в голове. Или, по крайней мере, у меня будет лучшее место, чтобы вернуться с моим вопросом, и для его изучения потребуется меньше времени.

  • Загрузить файл изображения из источника HTML-страницы с помощью python?
  • Почему функция Python len работает быстрее, чем метод __len__?
  • многопроцессорность с большими данными
  • Неясные повторяющиеся сбои в многопоточном консольном приложении Python с использованием tk
  • Вызов согласования NLTK - как получить текст до / после слова, которое было использовано?
  • Путаница в хешировании, используемая LSH
  • Можно ли использовать scrapy для очистки динамического содержимого с веб-сайтов, использующих AJAX?
  • Простой способ поставить точки останова PDB в код Python?
  • 6 Solutions collect form web for “В чем разница между re.search и re.match Python?”

    re.match к началу строки. Это не имеет ничего общего с новыми символами, поэтому это не то же самое, что использовать ^ в шаблоне.

    Как говорится в документации re.match :

    Если ноль или более символов в начале строки соответствуют шаблону регулярных выражений, верните соответствующий экземпляр MatchObject . Возврат None если строка не соответствует шаблону; обратите внимание, что это отличается от совпадения нулевой длины.

    Примечание. Если вы хотите найти совпадение в любом месте строки, используйте вместо него функцию search() .

    re.search ищет всю строку, так как в документации написано :

    Сканирование через строку, MatchObject место, где шаблон регулярного выражения создает совпадение, и возвращает соответствующий экземпляр MatchObject . Возврат None если никакая позиция в строке не соответствует шаблону; обратите внимание, что это отличается от поиска совпадения нулевой длины в некоторой точке строки.

    Поэтому, если вам нужно совпадать в начале строки или соответствовать совпадению всей строки. Это быстрее. В противном случае используйте search .

    В документации есть специальный раздел для match и search который также охватывает многострочные строки:

    Python предлагает две разные примитивные операции, основанные на регулярных выражениях: проверка соответствия для соответствия только в начале строки, в то время как search проверяет соответствие в любом месте строки (это то, что по умолчанию делает Perl).

    Обратите внимание, что match может отличаться от search даже при использовании регулярного выражения, начинающегося с '^' : '^' соответствует только в начале строки или в режиме MULTILINE также сразу же после новой строки. Операция « match » выполняется только в том случае, если шаблон совпадает в начале строки независимо от режима или в исходной позиции, заданной необязательным аргументом pos независимо от того, предшествует ли ей новая строка.

    Теперь достаточно разговоров. Время, чтобы увидеть пример кода:

     # example code: string_with_newlines = """something someotherthing""" import re print re.match('some', string_with_newlines) # matches print re.match('someother', string_with_newlines) # won't match print re.match('^someother', string_with_newlines, re.MULTILINE) # also won't match print re.search('someother', string_with_newlines) # finds something print re.search('^someother', string_with_newlines, re.MULTILINE) # also finds something m = re.compile('thing$', re.MULTILINE) print m.match(string_with_newlines) # no match print m.match(string_with_newlines, pos=4) # matches print m.search(string_with_newlines, re.MULTILINE) # also matches 

    search ⇒ найти что-нибудь в строке и вернуть объект соответствия.

    match ⇒ найти что-то в начале строки и вернуть объект соответствия.

    re.search search es для шаблона по всей строке , тогда как re.match не ищет шаблон; если это не так, у него нет другого выбора, кроме как сопоставить его в начале строки.

    вы можете ссылаться на приведенный ниже пример, чтобы понять работу re.match и re.search

     a = "123abc" t = re.match("[az]+",a) t = re.search("[az]+",a) 

    re.match не вернет none, но re.search вернет abc.

    Разница заключается в том, что re.match() вводит в заблуждение тех, кто привык к сопоставлению регулярных выражений Perl , grep или sed , а re.search() – нет. 🙂

    Более трезво, как замечает Джон Д. Кук , re.match() «ведет себя так, как если бы каждый шаблон имел». Другими словами, re.match('pattern') равен re.search('^pattern') . Таким образом, он закрепляет левую сторону рисунка. Но он также не привязывает правую сторону шаблона: это все равно требует завершения $ .

    Честно сказанное выше, я думаю, что re.match() должно быть устаревшим. Мне было бы интересно узнать причины, по которым его следует сохранить.

    re.match пытается сопоставить шаблон в начале строки . re.search пытается сопоставить шаблон по всей строке, пока не найдет совпадение.

    Python - лучший язык программирования в мире.