Python versión 3.4 no admite un prefijo ‘ur’

Tengo un código de python escrito en una versión anterior de python (2.x) y me cuesta trabajo para que funcione. Estoy usando python 3.4

_eng_word = ur"[a-zA-Z][a-zA-Z0-9'.]*" 

(Es parte de un tokenizador)

http://bugs.python.org/issue15096

Título: Eliminar soporte para el prefijo de cadena “ur”
Cuando PEP 414 restauró el soporte para los literales explícitos de Unicode en Python 3, se consideró que el prefijo de cadena “ur” era un sinónimo del prefijo “r”.

Por lo tanto, use ‘r’ en lugar de ‘ur’

De hecho, Python 3.4 solo admite u'...' (para admitir código que debe ejecutarse tanto en Python 2 como en 3) y r'....' , pero no en ambos. Esto se debe a que la semántica de cómo funciona ur'..' en Python 2 es diferente de cómo funcionaría ur'..' en Python 3 (en Python 2, \uhhhh y \Uhhhhhhhh aún se procesan escapes, en Python 3 a `r ‘…’ cadena no lo haría).

Tenga en cuenta que en este caso específico no hay diferencia entre el literal de cadena sin formato y el normal. Solo puedes usar:

 _eng_word = u"[a-zA-Z][a-zA-Z0-9'.]*" 

y funcionará tanto en Python 2 como en 3.

Para los casos en los que un literal de cadena sin formato es importante, puede decodificar la cadena sin raw_unicode_escape de raw_unicode_escape en Python 2, capturando el AttributeError en Python 3:

 _eng_word = r"[a-zA-Z][a-zA-Z0-9'.]*" try: # Python 2 _eng_word = _eng_word.decode('raw_unicode_escape') except AttributeError: # Python 3 pass 

Si solo estás escribiendo el código de Python 3 (para que ya no tenga que ejecutarse en Python 2), simplemente suelta la u completamente:

 _eng_word = r"[a-zA-Z][a-zA-Z0-9'.]*" 

Esta tabla compara (algunos de) los diferentes prefijos literales de cadena en Python 2 (.7) y 3 (.4+): introduzca la descripción de la imagen aquí

Como puedes ver, en Python 3 no hay manera de tener un literal que no procese escapes, pero sí procesa literales Unicode. Para obtener una cadena con un código que funcione tanto en Python 2 como en 3, use:

 br"[a-zA-Z][a-zA-Z0-9'.]*".decode('raw_unicode_escape') 

En realidad, su ejemplo no es muy bueno, ya que no tiene literales Unicode ni secuencias de escape. Un mejor ejemplo sería:

 br"[\u03b1-\u03c9\u0391-\u03a9][\t'.]*".decode('raw_unicode_escape') 

En Python 2:

 >>> br"[\u03b1-\u03c9\u0391-\u03a9][\t'.]*".decode('raw_unicode_escape') u"[\u03b1-\u03c9\u0391-\u03a9][\\t'.]*" 

En Python 3:

 >>> br"[\u03b1-\u03c9\u0391-\u03a9][\t'.]*".decode('raw_unicode_escape') "[α-ωΑ-Ω][\\t'.]*" 

Que es realmente lo mismo.