re.match vs re.search - PullRequest
       2

re.match vs re.search

0 голосов
/ 07 февраля 2012

Если я сделаю это

    import re
    m = re.compile("[0-9]{1,}Y")
    res = m.search("AUD3M25Y_EOD2")
    if res:
            return res.group(0)[:-1]

Я получу 25 в качестве ответа

Однако, если я сделаю

    import re
    m = re.compile(".*([0-9]{1,})Y.*")
    res = m.match("AUD3M25Y_EOD2")
    if res:
            return res.groups(0)

Я получу только 5.

Почему разница?

Имеет ли это какое-либо отношение к опции "global"?(очень похоже на s /// g в vi)

Ответы [ 2 ]

6 голосов
/ 07 февраля 2012

В вашем матче первый. * Равен жадный , он соответствует как можно большему количеству, включая цифры.Если вы сделаете его менее жадным, он будет работать:

 .*?([0-9]{1,})Y.*

(PS Я думаю, что эта жадная проблема не делает это справедливым сравнением re.search и re.match)

2 голосов
/ 07 февраля 2012

Пожалуйста, сначала прочтите документацию.Как и следовало ожидать, он имеет ответы.

re.search:

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

re.match:

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

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

Кроме того, на той же странице Сравнение с поиском :

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

...