Jak podano documentation, użycie regex.search(string, pos, endpos)
nie jest całkowicie równoznaczne z cięciem struny, tj. regex.search(string[pos:endpos])
. Nie pasuje to do wyrażenia regularnego pasującego do , tak jakby ciąg znaków zaczynał się od , więc ^
nie pasuje do początku podciągu, ale pasuje tylko do prawdziwego początku całego ciągu znaków. Jednak $
dopasowuje albo koniec podciągu, albo cały ciąg znaków.Dlaczego wyszukiwanie regex w podciągach "nie jest całkowicie równoważne z cięciem łańcucha" w Pythonie?
>>> 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']
Moje pytania są ... Dlaczego nie jest zgodne między zaczynają i kończąc mecz? Dlaczego używanie pos
i kończy się jako prawdziwy koniec, ale start/począteknie jest traktowany jako prawdziwy początek/początek?
Czy istnieje jakieś podejście, aby naśladować krojenie przy użyciu pos
i endpos
? Ponieważ Python copies string when slicing zamiast po prostu odwoływać się do starego, bardziej efektywne byłoby używanie pos
i endpos
zamiast krojenia podczas pracy z dużym ciągiem wiele razy.
Bardzo dziwne, wydaje się, że nowy moduł regex ma to samo zachowanie. –
Wygląda na to, że warto napisać raport o błędzie do pythona: http://bugs.python.org/ –
@ArminRigo Ale dokumentacja mówi, że to może być "funkcja" :) – BornToCode