Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/326.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.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正则表达式不处理字符串编码_Python_Regex_Unicode - Fatal编程技术网

python正则表达式不处理字符串编码

python正则表达式不处理字符串编码,python,regex,unicode,Python,Regex,Unicode,我有一个字符串(g),我在上面运行一个简单的正则表达式来查找一个数字。问题在于,不知何故,正则表达式无法处理该字符串类型(编码?)。 然而,“普通”字符串可以工作。 我错过了什么?请参见以下repl上的步骤: (示例是在线扑克锦标赛的摘要) 不工作: 您有UTF-16编码的数据,尽管没有BOM(字节顺序标记)。在尝试匹配正则表达式之前,先解码为Unicode: >>> g[:-1].decode('utf-16-le') u'Full Tilt Poker Tournament

我有一个字符串(g),我在上面运行一个简单的正则表达式来查找一个数字。问题在于,不知何故,正则表达式无法处理该字符串类型(编码?)。 然而,“普通”字符串可以工作。 我错过了什么?请参见以下repl上的步骤:

(示例是在线扑克锦标赛的摘要)

不工作:


您有UTF-16编码的数据,尽管没有BOM(字节顺序标记)。在尝试匹配正则表达式之前,先解码为Unicode:

>>> g[:-1].decode('utf-16-le')
u'Full Tilt Poker Tournament Summary $2.25 Heads-Up Sit & Go (250555914) 2-7 Triple Draw Limit (Turbo, Heads Up)\nBuy-In: $2.12 + $0.13\nBuy-In Chips: 1500\n2 Entries\nTotal Prize Pool: $4.24\nTournament started: 2013/03/08 06:00:27 ET\nTournament finished: 2013/03/08 06:14:30 ET\n\n1: Andrey3310, $4.24\n2: synthesiis\nsynthesiis finished in 2nd plac'
>>> myre.search(g[:-1].decode('utf-16-le')).groups()
(u'250555914',)
我不得不删除最后一个字节来进行解码,但最后一个空字节丢失了。如果从末尾缺少数据,则很可能也会从BOM表所在的起始位置缺少数据。BOM告诉解码器使用了什么UTF-16变体进行编码(little或big-endian),如果没有BOM,我们需要显式地告诉Python将其解码为little-endian

如果对包括BOM表在内的完整数据进行解码,则可以使用
.decode('utf-16')

如果您是从文件中读取此内容,请改用Python将其解码为Unicode:

import codecs

for line in codecs.open('filename.txt', 'r', encoding='utf16'):
    # handle line

因为像
.readlines()
这样的东西在字节级别拆分新行,新行被编码为两个字节,就像UTF-16中的其他内容一样。

您有UTF-16编码的数据,尽管没有BOM(字节顺序标记)。在尝试匹配正则表达式之前,先解码为Unicode:

>>> g[:-1].decode('utf-16-le')
u'Full Tilt Poker Tournament Summary $2.25 Heads-Up Sit & Go (250555914) 2-7 Triple Draw Limit (Turbo, Heads Up)\nBuy-In: $2.12 + $0.13\nBuy-In Chips: 1500\n2 Entries\nTotal Prize Pool: $4.24\nTournament started: 2013/03/08 06:00:27 ET\nTournament finished: 2013/03/08 06:14:30 ET\n\n1: Andrey3310, $4.24\n2: synthesiis\nsynthesiis finished in 2nd plac'
>>> myre.search(g[:-1].decode('utf-16-le')).groups()
(u'250555914',)
我不得不删除最后一个字节来进行解码,但最后一个空字节丢失了。如果从末尾缺少数据,则很可能也会从BOM表所在的起始位置缺少数据。BOM告诉解码器使用了什么UTF-16变体进行编码(little或big-endian),如果没有BOM,我们需要显式地告诉Python将其解码为little-endian

如果对包括BOM表在内的完整数据进行解码,则可以使用
.decode('utf-16')

如果您是从文件中读取此内容,请改用Python将其解码为Unicode:

import codecs

for line in codecs.open('filename.txt', 'r', encoding='utf16'):
    # handle line

因为像
.readlines()
这样的东西会在字节级别拆分新行,就像UTF-16中的其他格式一样,新行被编码为两个字节。

谢谢@Martijn Pieters,我仍然不明白为什么我在打开(文件).readlines()时会得到这种格式,而不是正常的UTF-16格式。在这一点上你能帮忙吗?不要在UTF-16编码的文件上使用
readlines()
!换行符也被编码为两个字节,您现在正在拆分文件。使用
codecs.open()
并读取Unicode数据。谢谢@Martijn Pieters,我仍然不明白为什么我在打开(文件).readlines()时会得到这种格式,而不是正常的utf-16格式。在这一点上你能帮忙吗?不要在UTF-16编码的文件上使用
readlines()
!换行符也被编码为两个字节,您现在正在拆分文件。使用
codecs.open()
并读取Unicode数据。