Recientemente (Trac XmlRpcPlugin mantenedores) se han notificado del hecho de que la expresión regular las tiras anteriores representan parejas sustitutas en construcciones angostas de Python (ver th:comment:13:ticket:11050). Un enfoque alternativo consiste en utilizar la siguiente expresión regular (consulte th:changeset:13729).
_illegal_unichrs = [(0x00, 0x08), (0x0B, 0x0C), (0x0E, 0x1F),
(0x7F, 0x84), (0x86, 0x9F),
(0xFDD0, 0xFDDF), (0xFFFE, 0xFFFF)]
if sys.maxunicode >= 0x10000: # not narrow build
_illegal_unichrs.extend([(0x1FFFE, 0x1FFFF), (0x2FFFE, 0x2FFFF),
(0x3FFFE, 0x3FFFF), (0x4FFFE, 0x4FFFF),
(0x5FFFE, 0x5FFFF), (0x6FFFE, 0x6FFFF),
(0x7FFFE, 0x7FFFF), (0x8FFFE, 0x8FFFF),
(0x9FFFE, 0x9FFFF), (0xAFFFE, 0xAFFFF),
(0xBFFFE, 0xBFFFF), (0xCFFFE, 0xCFFFF),
(0xDFFFE, 0xDFFFF), (0xEFFFE, 0xEFFFF),
(0xFFFFE, 0xFFFFF), (0x10FFFE, 0x10FFFF)])
_illegal_ranges = ["%s-%s" % (unichr(low), unichr(high))
for (low, high) in _illegal_unichrs]
_illegal_xml_chars_RE = re.compile(u'[%s]' % u''.join(_illegal_ranges))
p.s. Ver this post on surrogates explicando para qué sirven.
actualización a fin de que no coincida (sustituir) 0x0D
que es un valid XML character.
El punto de código Unicode máximo de Python depende de cómo se configuró cuando se compiló, marque 'sys.maxunicode'. – u0b34a0f6ae
Tienes razón. Supongo que es aún más complicado. – itsadok
En mi máquina, usar esta expresión regular para procesar una cadena de 2.3 MB demora .34 segundos. Eso me parece bastante rápido. –