Это следующий скрипт python:
text = '<?xml version="1.24" encoding="utf-8">'
mu = (".??[?]?[?]", "....")
for item in mu:
print item,":",re.search(item, text).group()
Может кто-нибудь объяснить, почему первый удар с регулярным выражением .??[?]?[?]
Возвращает <?
а не просто ?
,
Мое объяснение:
.??
ничего не должно соответствовать .?
может совпадать или нет какой-либо символ, а второй ?
делает его не жадным.[?]?
может совпадать ?
или нет, так что ничего хорошего тоже[?]
просто соответствует ?
Это должно привести ?
а не в <?
По той же причине o*?bar
соответствует oobar
в foobar
. Даже если квантификатор не является жадным, регулярное выражение будет пытаться совместить с первым символом всеми возможными способами, прежде чем переходить к следующему.
Сначала .??
совпадает с пустой строкой, но когда механизм regex возвращается к нему, он соответствует <
, таким образом, остальное соответствие регулярному выражению, не перемещая начальную позицию совпадения на следующий символ.
Regex "жадность" влияет только на обратное слежение; это не означает, что двигатель регулярных выражений пропустит более ранние потенциальные точки совпадения - регулярное выражение всегда принимает первое возможное совпадение. В этом случае это означает <?
потому что он начинается дальше слева ?
,