Wie der documentation angegeben ist, ist die Verwendung von regex.search(string, pos, endpos)
nicht vollständig äquivalent zum Schneiden der Zeichenfolge, d. H. regex.search(string[pos:endpos])
. Es wird keine Regex-Übereinstimmung als der String ist beginnend mit pos
, so ^
nicht entspricht der Anfang der Teilzeichenfolge, sondern entspricht nur den tatsächlichen Anfang der gesamten Zeichenfolge. $
entspricht jedoch entweder dem Ende der Teilzeichenfolge oder der gesamten Zeichenfolge.Warum sucht die Regex-Suche in Teilzeichenfolge "nicht vollständig äquivalent zum Aufteilen der Zeichenfolge" in Python?
>>> 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']
Meine Fragen sind ... Warum ist es nicht konsistent zwischen und beginnen Spiel zu beenden? Warum behandelt die Verwendung von pos
und endpos
das Ende als das echte Ende, aber der Start/Anfang wird nicht als der echte Start/Anfang behandelt?
Gibt es einen Ansatz zur Verwendung von pos
und endpos
imitieren schneiden? Da Python copies string when slicing nicht nur die alte referenziert, wäre es effizienter, pos
und endpos
anstelle von Slicing zu verwenden, wenn mit großen Strings mehrere Male gearbeitet wird.
Sehr seltsam scheint es, dass das neue Regex-Modul das gleiche Verhalten hat. –
Es sieht einen Fehlerbericht nach Python: http://bugs.python.org/ –
@ArminRigo Aber die Dokumentation sagte es, so könnte es ein "Feature" sein :) – BornToCode