Как указано в документации, использование regex.search(string, pos, endpos)
не полностью эквивалентно разрезанию строки, т.е. regex.search(string[pos:endpos])
. Он не будет выполнять регулярное выражение, как если бы строка начиналась с pos
, поэтому ^
не соответствует началу подстроки, но соответствует только реальному началу всей строки. Однако $
соответствует либо концу подстроки, либо всей строке.
>>> re.compile('^am').findall('I am falling in code', 2, 12)
[] # am is not at the beginning
>>> re.compile('^am').findall('I am falling in code'[2:12])
['am'] # am is the beginning
>>> re.compile('ing$').findall('I am falling in code', 2, 12)
['ing'] # ing is the ending
>>> re.compile('ing$').findall('I am falling in code'[2:12])
['ing'] # ing is the ending
>>> re.compile('(?<= )am').findall('I am falling in code', 2, 12)
['am'] # before am there is a space
>>> re.compile('(?<= )am').findall('I am falling in code'[2:12])
[] # before am there is no space
>>> re.compile('ing(?= )').findall('I am falling in code', 2, 12)
[] # after ing there is no space
>>> re.compile('ing(?= )').findall('I am falling in code'[2:12])
[] # after ing there is no space
>>> re.compile(r'\bm.....').findall('I am falling in code', 3, 11)
[]
>>> re.compile(r'\bm.....').findall('I am falling in code'[3:11])
['m fall']
>>> re.compile(r'.....n\b').findall('I am falling in code', 3, 11)
['fallin']
>>> re.compile(r'.....n\b').findall('I am falling in code'[3:11])
['fallin']
Мои вопросы... Почему это не согласуется между началом и окончанием матча? Почему использование pos
и endpos
обрабатывает конец как реальный конец, но начало/начало не рассматривается как реальное начало/начало?
Есть ли какой-либо подход, который позволяет использовать pos
и endpos
подражать разрезанию? Поскольку Python копирует строку при разрезании вместо простой ссылки на старую, было бы более эффективно использовать pos
и endpos
вместо нарезки при работе с большой строкой несколько раз.