Понимание жадных квалификаторов регулярных выражений Python

Возьмем этот пример:

import re
re.search(r"\bsr\.?\b","sr. manager")

‹Объект _sre.SRE_Match; промежуток = (0, 2), совпадение = 'sr'>

Это не тот результат, которого я ожидал.

Квалификатор ? является жадным, поэтому он должен соответствовать как можно большему количеству текста (ссылка).

При чтении шаблона он должен сказать: «сопоставить границу слова, за которой следует« sr », за которой следует 0 или 1 точка (но как можно больше символов), за которой следует еще одна граница слова». Так что я ожидал, что это будет математическое «сэр». и не только "ср". Это обходной путь, который я нашел:

re.search(r"\bsr(\.|\b)","sr. manager")

‹Объект _sre.SRE_Match; промежуток = (0, 3), совпадение = 'sr.'>

Нежадная версия дает вместо этого то, что я ожидал от нежадной версии:

re.search(r"\bsr\.??\b","sr. manager")

‹Объект _sre.SRE_Match; промежуток = (0, 2), совпадение = 'sr'>

Почему жадная версия не дает ожидаемого ответа? Что не так с моим пониманием этого типа квалификаторов?


person robertspierre    schedule 09.11.2017    source источник
comment
Квантификаторы, а не квалификаторы   -  person ctwheels    schedule 09.11.2017
comment
\b скидывает это. Он не соответствует чему-либо в месте ., поскольку . (точка, за которой следует пробел) не включает символ границы слова. Вместо этого вы должны использовать \bsr\b\.?. При желании вы можете добавить \B в конце как таковой \bsr\b\.?\B. Последнее гарантирует, что то, что следует за ., не является словесным символом.   -  person ctwheels    schedule 09.11.2017
comment
@ctwheels документация называет их квалификаторами повторения несколько раз   -  person robertspierre    schedule 09.11.2017
comment
Очень интересно ... Так не должно быть. На самом деле это квантификатор, а не квалификатор.   -  person ctwheels    schedule 09.11.2017
comment
Я отправил сообщение команде разработчиков документации Python, чтобы решить эту проблему. Эта терминология неверна.   -  person ctwheels    schedule 09.11.2017