2013-08-16 3 views
10

Python 3.3 ajoute la méthode casefold au type str, mais dans 2.x je n'ai rien. Quelle est la meilleure façon de contourner ce problème?Comment plier une chaîne dans Python 2?

+0

avez-vous besoin de traiter avec des chaînes non-anglais? – roippi

+0

Oui. Je veux exécuter l'algorithme de pliage de cas Unicode. –

Répondre

2

Il ya un fil here qui couvre certains des problèmes (mais peut ne pas résoudre tous), vous pouvez juger si elle convient à ce dont vous avez besoin. Si ce n'est pas bon, alors il y a quelques conseils utiles pour implémenter le pliage de cas sur le site W3C here.

3

Découvrez py2casefold.

>>> from py2casefold import casefold 
>>> print casefold(u"tschüß") 
tschüss 
>>> casefold(u"ΣίσυφοςfiÆ") == casefold(u"ΣΊΣΥΦΟσFIæ") == u"σίσυφοσfiæ" 
True 
+0

[Il ne semble pas très bien testé] (https://github.com/rwarren/py2casefold/blob/39a14b8971040b8f6015b7fa1a401c19c121175f/tests/test_casefold.py) – jfs

+0

J.F. Sebastian - que voulez-vous ajouter? Pour référence, [ici] (https://hg.python.org/cpython/file/d4669f43d05f/Lib/test/test_unicode.py#l568) correspond à l'étendue du test unitaire 'str.casefold' de python 3. – Russ

+0

voir si vous réussirez à tirer un test utile de ['regex: test_case_folding()'] (https://bitbucket.org/mrabarnett/mrab-regex/src/cbdb3caaee9ec68fdc2bff7e30902fb1dbdd3fd7/regex_3/Python/test_regex.py? at = default & fileviewer = fichier-view-default # test_regex.py-571) – jfs

1

Si PyICU est déjà installé; vous pouvez l'utiliser pour définir casefold(). En utilisant the same example strings as in @Russ' answer:

>>> import icu 
>>> casefold = lambda u: unicode(icu.UnicodeString(u).foldCase()) 
>>> print casefold(u"tschüß") 
tschüss 
>>> casefold(u"ΣίσυφοςfiÆ") == casefold(u"ΣΊΣΥΦΟσFIæ") == u"σίσυφοσfiæ" 
True 
>>> icu.UNICODE_VERSION 
'6.3' 
>>> import unicodedata 
>>> unicodedata.unidata_version 
'5.2.0' 

The result may depend on the version of Unicode standard.

Questions connexes