Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:对编码为&;的ascii数字使用re.sub#数量;_Python_Regex_Ascii - Fatal编程技术网

Python:对编码为&;的ascii数字使用re.sub#数量;

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ë”一词可能会出现。但它并没有这样显示,而是显示为
‚;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 &#130;x&#131;mpl&#137;.")
u'This is an \x82x\x83mpl\x89.'
以防之前不清楚:

>>> chr(130)
'\x82'
>>> chr(131)
'\x83'
>>> chr(137)
'\x89'
不要重新发明轮子。

int(“\g”)
在此处给出值error
int
是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'