2010-10-01 21 views
18

¿Cómo especifico un rango de caracteres Unicode de ' ' (espacio) a \u00D7FF?¿Cómo especifico un rango de caracteres Unicode?

Tengo una expresión regular como r'[\u0020-\u00D7FF]' y no se compilará diciendo que es un rango incorrecto. Soy nuevo en las expresiones regulares de Unicode, así que no he tenido este problema antes.

¿Hay alguna manera de hacer esta compilación o una expresión regular que estoy olvidando o que aún no he aprendido?

+0

Se compila bien aquí (2.6.5) – NullUserException

+0

Tienes razón - que se compila - que tenía asumí que era la parte de la expresión regular en la que estaba trabajando que estaba teniendo problemas. Publicaré la parte que me está causando problemas. – spig

Respuesta

24

La sintaxis de su rango Unicode no funcionará que esperas.

  1. La cadena de texto en r'' impide \u escapa de ser analizado, y el motor de expresiones regulares no hará esto. La única gama en este aparato es [0-\]:

    >>> re.compile(r'[\u0020-\u00d7ff]', re.DEBUG) 
    in 
        literal 117 
        literal 48 
        literal 48 
        literal 50 
        range (48, 117) 
        literal 48 
        literal 48 
        literal 100 
        literal 55 
        literal 102 
        literal 102 
    
  2. lo que es un Unicode literal causes \u parsing while leaving other backslashes alone (aunque eso no es una preocupación en este caso), pero los ceros a la izquierda se mezclarlo. La sintaxis es \uxxxx o \Uxxxxxxxx, por lo que se analiza como "\u00d7, f, f".

    >>> re.compile(ur'[\u0020-\u00d7ff]', re.DEBUG) 
    in 
        range (32, 215) 
        literal 102 
        literal 102 
    
  3. Extracción de los ceros a la izquierda o cambiar a \U0000d7ff lo arreglará:

    >>> re.compile(ur'[\u0020-\ud7ff]', re.DEBUG) 
    in 
        range (32, 55295) 
    
+1

Muchas gracias, no tenía ni idea de todas las cosas de Unicode. Entonces, tiene que ser de 4 dígitos con la minúscula 'u' y 8 con la mayúscula 'U', ¿verdad? – spig

+0

Eso es correcto. –

+0

Tenga en cuenta que esta respuesta se hace en el contexto de Python 2. En Python 3, no hay diferencia entre 'r" ejemplo "' y 'ur" ejemplo "'. – Flimm

5

Si está utilizando Python 2.x, usted debe asegurarse de que está especificando una cadena Unicode (con u '', o la "Unicode" built-in):

>>> r = re.compile(u'[\u0020-\uD7FF]') 
>>> r.search(u'foo \uD7F0 bar') 
<_sre.SRE_Match object at 0xb7084950> 
r.search(u' ') 
<_sre.SRE_Match object at 0xb7084b48> 

Usando prima strings (como lo es, con r '') le da la cadena (ascii) compuesta por "espalda" + la letra "u" más el número 0 más ...

+0

¿Necesita los caracteres '0' cuando el \ u no es lo suficientemente largo como para ser 4 de largo? Al igual que para un espacio, solo tendrías \ u20 pero tendrías que escribir \ u0020 ?, ¿verdad? – spig

+0

Veo que ya ha recibido una respuesta, pero sí, así es :) – rbp

+1

¿Qué hay de ** Unicode completo **? Por ejemplo, el bloque gótico se extiende desde U + 10330 LETRA GÓTICA AHSA hasta U + 1034A LETRA GÓTICA NINOSCIENTOS, pero también incluye los siguientes cinco puntos de código, actualmente sin nombre. ¿Cómo expresas en Python qué otros lenguajes de programación te permiten usar '\ p {Gothic}', '\ p {Script = Gothic}', '\ p {InGothic}', o '\ p {Block = Gothic}' ¿para? Por ejemplo, en Perl, '/ \ pN/&&/\ p {InGothic} /' produce U + 10341 GOTHIC LETTER NINETY y U + 1034A GOTHIC LETTER novecientos. Eso no funciona en Python, sin embargo; ¿Por qué no? – tchrist

Cuestiones relacionadas