Was genau ist die beabsichtigte Semantik für Zeichenbereiche in regulären Ausdrücken, wenn einer oder beide Endpunkte des Bereichs außerhalb des BMP liegen? Ich habe beobachtet, dass die folgende Eingabe in Python 2.7 und 3.5 anders verhält:Python-Semantik für Unicode-Bereiche mit astralen Ebenen
import re
bool(re.match(u"[\u1000-\U00021111]", "\u1234"))
In meinem 2.7 ich False
, in 3.5 ich True
. Letzteres macht für mich Sinn. Ersteres ist vielleicht auf \U00021111
zurückzuführen, das durch ein Ersatzpaar \ud844\udd11
dargestellt wird, aber selbst dann verstehe ich es nicht, da \u1234
gerade in Ordnung sein sollte.
- Ist das irgendwo angegeben?
- Ist das beabsichtigte Verhalten?
- Hängt dies nur von der Python-Version ab, oder auch von Kompilierzeit-Flags bezüglich UTF-16 vs. UTF-32?
- Gibt es eine Möglichkeit, konsistentes Verhalten ohne Fallunterscheidungen zu erhalten?
- Wenn Fallunterscheidungen unvermeidlich sind, was genau sind die Bedingungen?
Danke! Ich fühle mich dumm, dass ich das nicht bemerkt habe. Das zugrunde liegende Problem bleibt jedoch bestehen: 'bool (re.match (u [[u1000- \ U00021111]", u "\ ueeee")) "liefert immer noch andere Ergebnisse.Ich weiß, es ist ein schlechter Stil, eine Frage zu bearbeiten, sobald sie beantwortet wurde, so dass die Antwort nicht mehr zutrifft. Würdest du mit mir einverstanden sein oder sollte ich eine neue Frage stellen? – MvG
Überprüfen Sie [diese Python 2.7 IDEONE-Demo] (https://ideone.com/p9Jsgv). 'print (bool (re.match (u" [u1000- \ U00021111] ", u" \ ueeee ")))' druckt 'True'. Ihr Python 2.7 sollte so eingerichtet sein, dass Unicode-Eingaben möglich sind (siehe '# - * - Codierung: utf-8 - * -' Pragma). –
@ WiktorStribiżew '#coding: utf8' tut in diesem Fall nichts. Es deklariert die Codierung der Quelldatei selbst, und in dieser Quelle gibt es keine Nicht-ASCII-Zeichen. –