Python:对编码为&;的ascii数字使用re.sub#数量;
我有一篇文字,里面有一些奇怪的字符。例如,“éx–mplë”一词可能会出现。但它并没有这样显示,而是显示为Python:对编码为&;的ascii数字使用re.sub#数量;,python,regex,ascii,Python,Regex,Ascii,我有一篇文字,里面有一些奇怪的字符。例如,“éx–mplë”一词可能会出现。但它并没有这样显示,而是显示为;x;mpl和#137。幸运的是,这些数字是用ASCII编码的,所以我可以使用chr()来实现这一点。因此,我想替换&由chr(编号)生成 我开始使用re模块来实现这一点,但由于我没有这方面的经验,我不知道如何实现。下面是我的尝试,但当然,在执行re.sub()部分之前,代码尝试将int()部分转换为int,从而引发ValueError。我怎样才能正确地做到这一点 sen
;x;mpl和#137代码>。幸运的是,这些数字是用ASCII编码的,所以我可以使用chr()
来实现这一点。因此,我想替换&代码>由chr(编号)
生成
我开始使用re
模块来实现这一点,但由于我没有这方面的经验,我不知道如何实现。下面是我的尝试,但当然,在执行re.sub()
部分之前,代码尝试将int()
部分转换为int,从而引发ValueError
。我怎样才能正确地做到这一点
sentence = "This is an ‚xƒmpl‰."
chrpatt = "&#([0-9]{3});"
sentence = re.sub(chrpatt, chr(int("\g<1>")), sentence)
print sentence
句子=“这是一个;x;mpl;”
chrpatt=“([0-9]{3})”
句子=re.sub(chrpatt,chr(int(“\g”)),句子)
打印句子
您可以将可调用参数用于sub()
:
显然,数据是由DOS代码页之一(437或850)编码的:在我家的Linux系统上,我必须这样做
>>> print re.sub(chrpatt, lambda m: chr(int(m.group(1))) , sentence).decode("cp437")
This is an éxâmplë.
>>> re.sub(chrpatt, lambda m: chr(int(m.group(1))) , sentence).decode("cp437")
u'This is an \xe9x\xe2mpl\xeb.'
以获得正确的输出
这里发生了什么
对于每一个匹配,给定的函数都会被传递给match对象,并且应该返回替换字符串
因此,我们只需这样做—从匹配中提取数字并执行您建议的步骤。您不需要在此处使用正则表达式
有一个完整的库,名为HTMlParser
示例:
>>> import HTMLParser
>>> h = HTMLParser.HTMLParser()
>>> h.unescape("This is an ‚xƒmpl‰.")
u'This is an \x82x\x83mpl\x89.'
以防之前不清楚:
>>> chr(130)
'\x82'
>>> chr(131)
'\x83'
>>> chr(137)
'\x89'
不要重新发明轮子。int(“\g”)
在此处给出值errorint
是int构造函数。如果给这个构造函数一个字符串,它希望找到一个表示数字的字符串。显然,字符串“\g”看起来不像数字的表示形式
在您的例子中,re.sub的第二个参数应该是一个函数,它将获取找到的匹配项并对其进行转换
引自python文档
re.sub(模式、应答、字符串、计数=0、标志=0)
如果repl是一个函数,则会为模式的每个非重叠出现调用它。函数接受单个匹配对象参数,并返回替换字符串。例如:
这是完全一样的,对吗<代码>打印回复(chrpatt,lambda m:chr(int(m.group(1))),句子)
@Lewistrick Yes。通常情况下,我会写这个,但不得不测试一点,然后就忘了它。>>打印“这是一个\x82x\x83mpl\x89。”这是一个�x�mpl�.代码>@JamesMills取决于您使用的编码。@Lewistrick您一定是在开玩笑吧<代码>打印x
其中x
是结果。e、 g:x=h.unescape
sigh@Lewistrick“它不起作用”是一个非常简洁的描述发生了什么…对不起,这是一个非常直截了当的表达我自己的方式。我的意思是:print u'这是一个\x82x\x83mpl\x89。
返回一个UnicodeDecodeError
(字符映射到)。@Lewistrick当您的示例使用CP437或CP850时,u'这是一个\x82x\x83mpl\x89。
是错误的。相反,u'这是一个\xe9x\xe2mpl\xeb.
是正确的。这些数据是从哪里获得的?HTML使用DOS代码页编码区分字符是非常罕见的。数据是使用urllib2
从网站读取的。
>>> chr(130)
'\x82'
>>> chr(131)
'\x83'
>>> chr(137)
'\x89'