Регулярное выражение соответствует больше, чем ожидалось

1

Это следующий скрипт python:

text = '<?xml version="1.24" encoding="utf-8">'
mu = (".??[?]?[?]", "....")
for item in mu:
    print item,":",re.search(item, text).group()

Может кто-нибудь объяснить, почему первый удар с регулярным выражением .??[?]?[?] Возвращает <? а не просто ? ,

Мое объяснение:

  • .?? ничего не должно соответствовать .? может совпадать или нет какой-либо символ, а второй ? делает его не жадным.
  • [?]? может совпадать ? или нет, так что ничего хорошего тоже
  • [?] просто соответствует ?

Это должно привести ? а не в <?

Теги:
pattern-matching

2 ответа

3
Лучший ответ

По той же причине o*?bar соответствует oobar в foobar. Даже если квантификатор не является жадным, регулярное выражение будет пытаться совместить с первым символом всеми возможными способами, прежде чем переходить к следующему.

Сначала .?? совпадает с пустой строкой, но когда механизм regex возвращается к нему, он соответствует <, таким образом, остальное соответствие регулярному выражению, не перемещая начальную позицию совпадения на следующий символ.

2

Regex "жадность" влияет только на обратное слежение; это не означает, что двигатель регулярных выражений пропустит более ранние потенциальные точки совпадения - регулярное выражение всегда принимает первое возможное совпадение. В этом случае это означает <? потому что он начинается дальше слева ? ,

Ещё вопросы

Сообщество Overcoder
Наверх
Меню