Python正则表达式与拉丁1字符编码?

Python正则表达式与拉丁1字符编码?,python,encoding,utf-8,character-encoding,Python,Encoding,Utf 8,Character Encoding,我有一个包含(我相信)拉丁1编码的文件 但是,我无法将正则表达式与此文件进行匹配 如果我对文件进行cat,它看起来很好: 但是,我找不到字符串: In [12]: txt = open("b").read() In [13]: print txt <Vw_IncidentPipeline_Report> In [14]: txt Out[14]: '\x00 \x00 \x00<\x00V\x00w\x00_\x00I\x00n\x00c\x00i\x00d\x00

我有一个包含(我相信)拉丁1编码的文件

但是,我无法将正则表达式与此文件进行匹配

如果我对文件进行cat,它看起来很好:

但是,我找不到字符串:

In [12]: txt = open("b").read()

In [13]: print txt
  <Vw_IncidentPipeline_Report>


In [14]: txt
Out[14]: '\x00 \x00 \x00<\x00V\x00w\x00_\x00I\x00n\x00c\x00i\x00d\x00e\x00n\x00t\x00P\x00i\x00p\x00e\x00l\x00i\x00n\x00e\x00_\x00R\x00e\x00p\x00o\x00r\x00t\x00>\x00\r\x00\n'

In [22]: txt.find("Vw_IncidentPipeline_Report")
Out[22]: -1

In [23]: txt.decode("latin-1")
Out[23]: u'\x00 \x00 \x00<\x00V\x00w\x00_\x00I\x00n\x00c\x00i\x00d\x00e\x00n\x00t\x00P\x00i\x00p\x00e\x00l\x00i\x00n\x00e\x00_\x00R\x00e\x00p\x00o\x00r\x00t\x00>\x00\r\x00\n'

In [25]: txt.decode("utf-16le")
Out[25]: u'\u2000\u2000\u3c00\u5600\u7700\u5f00\u4900\u6e00\u6300\u6900\u6400\u6500\u6e00\u7400\u5000\u6900\u7000\u6500\u6c00\u6900\u6e00\u6500\u5f00\u5200\u6500\u7000\u6f00\u7200\u7400\u3e00\u0d00\u0a00'
[12]中的
:txt=open(“b”).read()
在[13]:打印文本
In[14]:txt
输出[14]:“\x00\x00\x00\x00\r\x00\n”
[22]:txt.find(“大众意外事故报告”)
Out[22]:-1
在[23]:txt.decode(“拉丁语-1”)
Out[23]:u'\x00\x00\x00\x00\r\x00\n'
在[25]:txt.decode(“utf-16le”)
Out[25]:u'\u2000\u2000\u3c00\u5600\u7700\u5f00\u4900\u6e00\u6300\u6900\u6400\u6500\u6e00\u7400\u5000\u6900\u7000\u6500\u6c00\u6900\u6500\u5f00\u5200\u6500\u7000\u6f00\u7200\u7400\u3e00\u0d00\u0a00'

如何成功解码字符串,以便在其中找到字符串?

您可以尝试模块,查看有关编码的GES是否正确。

可能是UTF-8。你的正则表达式是什么?

不是拉丁文1,而是utf-16大端:

>>> txt = '\x00 \x00 \x00<\x00V\x00w\x00_\x00I\x00n\x00c\x00i\x00d\x00e\x00n\x00t\x00P\x00i\x00p\x00e\x00l\x00i\x00n\x00e\x00_\x00R\x00e\x00p\x00o\x00r\x00t\x00>\x00\r\x00\n'
>>> txt.decode("utf-16be")
u'  <Vw_IncidentPipeline_Report>\r\n'
>>txt='\x00\x00\x00\x00\r\x00\n'
>>>txt.解码(“utf-16be”)
u'\r\n'

所以,就这样解码,从此过上幸福的生活;-)

您的编码错误。尝试
txt.decode(“UTF-16BE”)

让我们检查一下iconv

>>> txt='\x00 \x00 \x00<\x00V\x00w\x00_\x00I\x00n\x00c\x00i\x00d\x00e\x00n\x00t\x00P\x00i\x00p\x00e\x00l\x00i\x00n\x00e\x00_\x00R\x00e\x00p\x00o\x00r\x00t\x00>\x00\r\x00\n'
>>> open("txt","w").write(txt)
>>> exit()
$ iconv -f utf-16be txt
  <Vw_IncidentPipeline_Report>
>>txt='\x00\x00\x00\x00\r\x00\n'
>>>打开(“txt”,“w”)。写入(txt)
>>>退出()
$iconv-f utf-16be txt

不,那里没有日语

实际上,它是UTF-18LE,所以我使用:

iconv -f 'UTF-16LE//' -t utf-8 -c

不,不是所有的
\x00
s,不可能是utf-8。根据我的回答,从未见过更清晰的UTF-16大端编码。从技术上讲,数据是有效的UTF-8。但谁写的文件交替使用U+0000和ASCII字符?你不是说“这不是拉丁-1”吗?事实上,我认为它是utf-16le。带有utf-16be的iconv是日语的。@Joseph,你可能在文件中的python转义码中使用了iconv吗?如果您使用的是iconv,则需要将
\x00
替换为
NUL
bytes@Bob是的,我的意思是拉丁文1,tx,+1@Joseph,你错了:BE的解码很好,而LE的解码很好(正如你已经展示的),那么你为什么会有不同的想法呢?如果你想用iconv而不是Python,你为什么要把你的问题标记为“Python”,顺便说一句?事实上,我认为这是utf-16le。带utf-16be的iconv是日语的。@Joseph,iconv适合我。你能告诉我们你是怎么得到日语的吗?文件开头有字节顺序标记(
'\xff\xfe'
'\xfe\xff'
)吗?除非OP编辑了上面的成绩单,否则文件显然(a)以UTF-16BE编码(b)开头没有BOM。你显然没有试过
chardet
记录用于使用带BOM的UTF-16xE,而不是其他方式。下面是试用它的结果:>>>>chardet.detect(txt){'confidence':1.0,'encoding':'ascii'}>>>字节顺序标记:Unicode可以编码为16位或32位整数,因此您必须知道使用哪种编码。这是字节顺序标记,而不是代码大小标记。其主要目的是标记整数是以bigendian顺序表示还是以littleendian顺序表示。参见
http://en.wikipedia.org/wiki/Byte_order_mark