Python 使用utf-8字符串的re.sub的奇怪行为

Python 使用utf-8字符串的re.sub的奇怪行为,python,regex,encoding,Python,Regex,Encoding,有人能解释我这种奇怪的行为吗?我希望这两种方法同时起作用或不起作用。是我还是有人觉得这不连贯 >>> u'è'.replace("\xe0","") Traceback (most recent call last): File "<stdin>", line 1, in <module> UnicodeDecodeError: 'ascii' codec can't decode byte 0xe0 in position 0: ordinal n

有人能解释我这种奇怪的行为吗?我希望这两种方法同时起作用或不起作用。是我还是有人觉得这不连贯

>>> u'è'.replace("\xe0","")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe0 in position 0: ordinal not in range(128)
>>> re.sub(u'è','\xe0','',flags=re.UNICODE)
''
>>u'è.替换(“\xe0”,”)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
UnicodeDecodeError:“ascii”编解码器无法解码位置0中的字节0xe0:序号不在范围内(128)
>>>re.sub(u'è','\xe0','',flags=re.UNICODE)
''
(请注意,我不是要求解释为什么u'è.replace(“\xe0,”)会引发错误!)

From

这些方法的参数可以是Unicode字符串或8位 串。8位字符串在携带之前将转换为Unicode 进行手术;将使用Python的默认ASCII编码,因此 大于127的字符将导致异常

发件人:

此模块提供类似于的正则表达式匹配操作 那些在Perl中找到的。要搜索的模式和字符串都可以 Unicode字符串以及8位字符串


因为对于Re模块,您没有显式指定Unicode标志,所以它没有尝试转换,因此不会引发错误。这就是为什么它们的行为不一致的原因。Python2.X对编码的处理有些不自然,需要隐式转换。当用户不负责转换时,它将尝试使用unicode而不使用unicode字符串。最后,这并不能解决问题:编码必须从一开始就得到开发人员的认可。Python2只是让事情变得不那么明确,也不那么明显

>>> u'è'.replace(u"\xe0", u"")
u'\xe8'
这是您最初的示例,除了,我特别告诉Python所有字符串都是unicode。如果不这样做,Python将尝试转换它们。因为Python2中的默认编码是ASCII,所以您的示例显然会失败

编码是一个棘手的问题,但有一些好习惯(比如早期转换,总是确定程序在给定点处理什么类型的数据),它通常(我坚持,通常)进行得很顺利


希望有帮助

unicode.replace
当然不是与
re.sub
相同的方法。我的观点是,对于相同的输入,它们的行为应该是一致的。正是这些问题导致了在Python3.Mhh中更严格地执行Unicode而不是字节字符串。关于国旗这件事不太夸张;>>>re.sub(u'è','\xe0','',flags=re.UNICODE)仍然返回给我“re模块完全有可能捕获该异常,并且对其不透明,只是一种预感,未确认。对我来说不起作用:(Python对unicode的支持非常糟糕。我已经浪费了3天时间,仍然无法完成一个超级简单的读-改-写函数。