如何在python 3中模拟python 2 str.lower()

jtb*_*tbr 5 python python-2.7 python-3.x

python 2.7.15和3.7.2如何执行小写操作之间似乎有区别.

我有一个大字典和一个大型列表,使用python 2编写,但我想在python 3中使用(使用pickle从文件导入).对于字符串列表中的每个项目,在python2 lower()案例的dict中有一个键.不幸的是,它们与python3 lower()案例不同.

unicode.lower()在python 3中运行时,如何获得python 2返回的答案?

python 3列表中的字符串示例是'?le',其小写字母是'i?le'(顺便说一下,它不是ascii 'ile').这不在字典中.从泡菜,3为读取什么蟒"?le"被读入蟒2作为u'\u0130le',小写其中是"ile"(将ASCII字符串),它在字典.这就是我需要回归的东西.

为了澄清,我正在添加一个例子(后者是ascii字符串).

python 2.7:

>>> u"\u0130le".lower() == "ile"
>>> True
Run Code Online (Sandbox Code Playgroud)

python 3.7:

>>> u"\u0130le".lower() == "ile"
>>> False
Run Code Online (Sandbox Code Playgroud)

mki*_*ver 2

蛮力解决方案。

\n\n

在Python2中创建一个较低的地图,然后在Python3中使用它。

\n\n

创建地图的Python2程序:

\n\n
f = open('py2_lower_map', 'w')\n\nfor i in range(256):\n    for j in range(256):\n        b = chr(j) + chr(i)\n        try:\n            low = b.decode('utf16').lower()\n        except:\n            low = str('?')\n        f.write(low.encode('utf-8'))\n\nf.close()\n
Run Code Online (Sandbox Code Playgroud)\n\n

Python3中如何使用地图的demo:

\n\n
f = open('py2_lower_map', 'r', encoding='utf-8')\n_py2_lower_map = f.read()\nf.close()\n\ndef py2_lower(u):\n    return ''.join(_py2_lower_map[ord(c)] for c in u)\n\nlow = py2_lower('\xc4\xb0le')\nprint(low)\nprint([ord(c) for c in low])\n
Run Code Online (Sandbox Code Playgroud)\n\n

老实说,这可能有粗糙的角落,而且又快又脏,\n但主要是做正确的事情。它适用于一个示例;-)

\n