¿Se puede hacer el patrón de expresión regular de Python para que coincida y reemplace los caracteres Unicode que no son ASCII?

En la siguiente expresión regular, me gustaría que cada carácter de la cadena fuera reemplazado por una ‘X’, pero no funciona.

En Python 2.7:

>>> import re >>> re.sub(u"[a-zA-Z]","X","dfäg") 'XX\xc3\xa4X' 

o

 >>> re.sub("[a-zA-Z]","X","dfäg",re.UNICODE) u'XX\xe4X' 

En Python 3.4:

 >>> re.sub("[a-zA-Z]","X","dfäg") 'XXäX' 

¿Es posible de alguna manera ‘configurar’ el patrón [a-zA-Z] para que coincida con ‘ä’, ‘ü’, etc.? Si esto no se puede hacer, ¿cómo puedo crear un patrón de rango de caracteres similar entre corchetes que incluya caracteres Unicode en el rango habitual del ‘alfabeto completo’? Quiero decir, en un idioma como el alemán, por ejemplo, ‘ä’ se ubicaría en algún lugar cerca de ‘a’ en el alfabeto, por lo que uno esperaría que se incluyera en el rango ‘az’.

Puedes utilizar

 (?![\d_])\w 

Con el modificador Unicode. El look-ahead (?![\d_]) está restringiendo la clase \w shorthand para que no pueda coincidir con ningún dígito ( \d ) o guiones bajos.

Ver demo regex

Una demostración de Python 3 :

 import re print (re.sub(r"(?![\d_])\w","X","dfäg")) # => XXXX 

En cuanto a Python 2 :

 # -*- coding: utf-8 -*- import re s = "dfäg" w = re.sub(ur'(?![\d_])\w', u'X', s.decode('utf8'), 0, re.UNICODE).encode("utf8") print(w)