Возьмем этот пример:
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'>
Почему жадная версия не дает ожидаемого ответа? Что не так с моим пониманием этого типа квалификаторов?
\b
скидывает это. Он не соответствует чему-либо в месте.
, поскольку.
(точка, за которой следует пробел) не включает символ границы слова. Вместо этого вы должны использовать\bsr\b\.?
. При желании вы можете добавить\B
в конце как таковой\bsr\b\.?\B
. Последнее гарантирует, что то, что следует за.
, не является словесным символом. - person ctwheels   schedule 09.11.2017