Ich schrieb ein Programm, um (begrenzt) unicode support zu Python Regexes hinzuzufügen, und während es auf CPython 2.5.2 funktioniert, funktioniert es nicht auf PyPy (
1.5.0-alpha0
1.8.0, Implementierung von Python
2.7.1
2.7.2), beide unter Windows XP (Edit: wie in den Kommentaren gesehen, @dbaupp könnte es gut laufen auf Linux). Ich habe keine Ahnung warum, aber ich vermute, dass es etwas mit meinen Anwendungen von u"
und ur"
zu tun hat. Die vollständige Quelle ist here, und die entsprechenden Bits sind:Unicode, reguläre Ausdrücke und PyPy
# -*- coding:utf-8 -*-
import re
# Regexps to match characters in the BMP according to their Unicode category.
# Extracted from Unicode specification, version 5.0.0, source:
# http://unicode.org/versions/Unicode5.0.0/
unicode_categories = {
ur'Pi':ur'[\u00ab\u2018\u201b\u201c\u201f\u2039\u2e02\u2e04\u2e09\u2e0c\u2e1c]',
ur'Sk':ur'[\u005e\u0060\u00a8\u00af\u00b4\u00b8\u02c2-\u02c5\u02d2-\u02df\u02...',
ur'Sm':ur'[\u002b\u003c-\u003e\u007c\u007e\u00ac\u00b1\u00d7\u00f7\u03f6\u204...',
...
ur'Pf':ur'[\u00bb\u2019\u201d\u203a\u2e03\u2e05\u2e0a\u2e0d\u2e1d]',
ur'Me':ur'[\u0488\u0489\u06de\u20dd-\u20e0\u20e2-\u20e4]',
ur'Mc':ur'[\u0903\u093e-\u0940\u0949-\u094c\u0982\u0983\u09be-\u09c0\u09c7\u0...',
}
def hack_regexp(regexp_string):
for (k,v) in unicode_categories.items():
regexp_string = regexp_string.replace((ur'\p{%s}' % k),v)
return regexp_string
def regex(regexp_string,flags=0):
"""Shortcut for re.compile that also translates and add the UNICODE flag
Example usage:
>>> from unicode_hack import regex
>>> result = regex(ur'^\p{Ll}\p{L}*').match(u'áÇñ123')
>>> print result.group(0)
áÇñ
>>>
"""
return re.compile(hack_regexp(regexp_string), flags | re.UNICODE)
(auf PyPy gibt es keine Übereinstimmung in der "Anwendungsbeispiel", so result
ist None
)
erneuten Ausdruck, arbeitet das Programm fein (auf CPython): Die Unicode-Daten scheinen korrekt zu sein, die Ersetzung funktioniert wie vorgesehen, das Anwendungsbeispiel läuft ok (beide über doctest
und direkt in der Befehlszeile eingeben). Die Codierung der Quelldatei ist ebenfalls korrekt, und die Direktive coding
in der Kopfzeile scheint von Python erkannt worden zu sein.
Irgendwelche Ideen, was PyPy "anders" macht, das meinen Code bricht? Viele Dinge kamen zu meinem Kopf (unerkannt coding
Header, verschiedene Codierungen in der Befehlszeile, verschiedene Interpretationen von r
und u
) aber soweit meine Tests gehen, scheint sowohl CPython und PyPy identisch zu verhalten, so dass ich nicht weiß, was zu tun versuche es als nächstes.
Gibt es einen bestimmten Grund, warum Sie eine solche alte instabile Version von PyPy verwenden? (Die letzte stabile Version ist 1.8.) – huon
Auch das angegebene Beispiel funktioniert gut mit '[PyPy 1.8.0 mit GCC 4.4.3] auf linux2'. Es sieht also so aus, als ob du dein PyPy aktualisieren musst. – huon
@ dbaupp uh ...Weil das auf meinem Rechner installiert ist? (hey, es war neu, als ich es installiert habe ...) Nun, im Ernst, ich habe es nur auf 1.8.0 aktualisiert und erhalte immer noch die gleichen Ergebnisse. Da Sie es geschafft haben, es unter Linux arbeiten zu lassen, ist das Problem möglicherweise auf Windows beschränkt. Ich werde weiter untersuchen. – mgibsonbr