Expresiones Regulares y Unicode

Un problema clásico, con expresiones regulares, es utilizarlas para reconocer caracteres alfanuméricos. En teoría \w lo hace, pero en la práctica las cosas son más complicadas debido a la codificación de caracteres en bytes, al hecho de que \w es arcaico y sólo reconoce ascii, etc. Por eso en algunas librerías hay un flag para usar las base de datos de unicode para detectar números y caracteres alfanuméricos (re.U en python). No se usa por defecto porque es relativamente costoso, y por el least surprising behavior principle, pero ahí está. Un ejemplo:

>>> import re
>>> parole=re.compile(r"(\w+)",re.U)
>>> print " ".join([i.group() for i in parole.finditer(
        u"España, una; España, grande; España, libre. ¡Viva França!")
        if i.group()])
España una España grande España libre Viva França

De bonus el uso de unicodedata (un módulo python basado en unidata para manejar esa información :


import sys,unicodedata; print "".join(unichr(i) for i in range(sys.maxunicode) if 'No' == unicodedata.category(unichr(i)))
²³¹¼½¾৴৵৶৷৸৹௰௱௲༪༫༬༭༮༯༰༱༲༳፩፪፫፬፭፮፯፰፱፲፳፴፵፶፷፸፹፺፻፼៰៱៲៳៴៵៶៷៸៹⁰⁴⁵⁶⁷⁸⁹₀₁₂₃₄₅₆₇₈₉⅓⅔⅕⅖⅗⅘⅙⅚
⅛⅜⅝⅞⅟①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳⑴⑵⑶⑷⑸⑹⑺⑻⑼⑽⑾⑿⒀⒁⒂⒃⒄⒅⒆⒇
⒈⒉⒊⒋⒌⒍⒎⒏⒐⒑⒒⒓⒔⒕⒖⒗⒘⒙⒚⒛⓪⓫⓬⓭⓮⓯⓰⓱⓲⓳⓴⓵⓶⓷⓸⓹⓺⓻⓼⓽⓾
⓿❶❷❸❹❺❻❼❽❾❿➀➁➂➃➄➅➆➇➈➉➊➋➌➍➎➏➐➑➒➓⳽㆒㆓㆔㆕㈠㈡㈢㈣㈤㈥㈦㈧㈨㈩
㉑㉒㉓㉔㉕㉖㉗㉘㉙㉚㉛㉜㉝㉞㉟㊀㊁㊂㊃㊄㊅㊆㊇㊈㊉㊱㊲㊳㊴㊵㊶㊷㊸㊹㊺㊻㊼㊽㊾㊿
...

La categoría que listo es Numeric, other, es decir, otros caracteres numéricos. En la página se verán más o menos caracteres numéricos según las tipografías disponibles. El número de caracteres disponibles dependen del python instalado. Las categorías de Unicode son:

>>> set(unicodedata.category(unichr(i)) for i in range(sys.maxunicode))
set(['Ps', 'Nl', 'No', 'Lo', 'Ll', 'Lm', 'Nd', 'Pc', 'Lt', 'Lu', 'Pf',
     'Pd', 'Pe', 'Pi', 'Po', 'Me', 'Mc', 'Mn', 'Sk', 'So', 'Sm', 'Sc',
     'Zl', 'Co', 'Cn', 'Cc', 'Cf', 'Cs', 'Zp', 'Zs'])

La complejidad de la base de datos de unicode da una idea del ímprobo trabajo de reconstruir la Babel humana: miles de lenguas, con decenas de alfabetos. Hay ya más de un millón de caracteres asignados y catalogados, y se sigue trabajando; la última vez que miré faltaba, por ejemplo, el azteca. Al klingon se le negó la entrada: no hay alfabetos y lenguajes de ficción en Unicode.

Add your comment












Nav Bar