我必须检查用双字节字符编码的日语字符串(当然文件不是Unicode,我必须将它们保存在Shift-JIS中)。这些字符串中的许多都包含也是双字节字符的数字(123456789),而不是标准的单字节数字(0-9)。因此,搜索数字的常用方法不起作用(在正则表达式中使用[0-9],或者例如\ d)。
我发现使其工作的唯一方法是创建一个元组并在字符串中迭代元组以寻找匹配,但是有更有效的方法吗?
这是我在搜索双字节数时得到的输出示例:
>>> s = "234" # "2" is a double-byte integer
>>> if u"2" in s:
print "y"
>>> if u"2" in s:
print "y"
y
>>> print s[0]
>>> print s[:2]
2
>>> print s[:3]
23
非常感谢任何建议!
答案 0 :(得分:3)
首先,评论是正确的:为了您的理智,您应该只使用Python代码中的unicode,从Shift-JIS解码,然后编码回Shift-JIS,如果&# 39;你需要输出什么:
text = incoming_bytes.decode("shift_jis")
# ... do stuff ...
outgoing_bytes = text.encode("shift_jis")
请参阅:Convert text at the border。
既然您正确地执行了它:unicode和编码的字节串,它可以直接获得"任何数字"或"任何双倍宽度的数字"正则表达式:
>>> import re
>>> s = u"234"
>>> digit = re.compile(r"\d", re.U)
>>> for d in re.findall(digit, s):
... print d,
...
2 3 4
>>> wdigit = re.compile(u"[0-9]+")
>>> for wd in re.findall(wdigit, s):
... print wd,
...
2
如果您不熟悉re.U
标记,则会记录here。
答案 1 :(得分:0)
我遇到类似的问题,面对日语双字节字符和一个相对简单的方法来处理我发现的字符是使用简单的Unicode数字转换它们(至少为了处理它们,如果你想保持文件原样):
ord("2")
将返回
65298
距离单字节字符2
65248点。所以转换回来可以使用:
def convert_two_byte_numbers(character: str):
if ord(character) in range(65296, 65306):
return chr(ord(character) - 65248)
else:
return character
如果像我一样,您还需要转换双字节字母,请为范围(65313, 65339)
和(65345, 65371)
添加相同的内容。