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