尝试将正则表达式应用于以latin-1(ISO-8859-1)编码的某些字符串时,我遇到了问题。
我要做的是通过HTTP POST将一些数据从ISO-8859-1编码的页面发送到我的python应用程序,并使用我的python脚本中的正则表达式对数据进行一些解析。
网页使用jQuery将数据发送到服务器,我使用.text()
方法从页面中抓取文本。将数据发送回服务器后如下所示:re.compile(r"^[\s,]*(\d*\s*\d*\/*\d)[\s,]*")
- 不幸的是,我的正则表达式中的\s
与我的数据不匹配,我将问题追溯到html页面使用的事实
被编码为0xA0
(非中断空格)并发送到服务器。出于某种原因,似乎我的脚本没有将该字符解释为空格并且不匹配。根据python [文档] [1],它看起来应该可以工作,所以我必须在这里遇到编码问题。
然后我想尝试将字符串转换为unicode并将其传递给正则表达式,因此我尝试查看转换字符串时会发生什么:print(unicode(data, 'iso-8859-1'))
。
不幸的是我收到了这个错误:
UnicodeEncodeError at /script/
'ascii' codec can't encode character u'\xa0' in position 122: ordinal not in range(128)
我很困惑 - 我显然没有尝试使用ASCII解码 - 即使我显然传递了另一个编解码器,python也试图使用ASCII进行解码?
答案 0 :(得分:2)
请改为尝试:
print(repr(unicode(data, 'iso-8859-1')))
通过打印unicode对象,您隐式尝试将其转换为默认编码,即ASCII。使用repr
会将其转换为ASCII安全形式,此外,您可以更轻松地找出正在进行调试的内容。
答案 1 :(得分:1)
您使用的是Python 3.X还是2.X?它有所作为。实际上看起来像2.X但是你使用print(blahblah)让我困惑: - )
回答上一个问题:是的,执行print()
时默认为ASCII。在3.X上:使用print(ascii(foo))
进行调试,而不是print(foo)
。在2.X上使用repr()
,而不是ascii()
。
如果(a)数据是unicode,(b)你将re.UNICODE标志与re.compile()
一起使用,那么无中断空间的原始问题应该消失