簡體   English   中英

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

[英]How to simulate python 2 str.lower() in python 3

python 2.7.15和3.7.2如何執行小寫操作之間似乎有區別。

我有一個大字典和一個大型列表,使用python 2編寫,但我想在python 3中使用(使用pickle從文件導入)。 對於字符串列表中的每個項目,在python2 lower()情況的dict中有一個鍵。 不幸的是,它們與python3 lower()案例不同。

在python 3中運行時,如何得到python 2返回unicode.lower()的答案?

python 3列表中的一個字符串示例是'İle' ,其小寫字母是'i̇le' (順便'i̇le' ,它不是'i̇le' 'ile' )。 這不在字典中。 從泡菜,什么巨蟒-3作為讀"İle"作為被讀入蟒2 u'\İle' ,小寫其中是"ile" (在ASCII字符串),這在字典。 這就是我需要回歸的東西。

為了澄清,我正在添加一個例子(后者是ascii字符串)。

python 2.7:

>>> u"\u0130le".lower() == "ile"
>>> True

python 3.7:

>>> u"\u0130le".lower() == "ile"
>>> False

您可以使用Unidecode庫。

這個庫將unicode轉換為它最接近的ASCII等價物,這似乎是你想要的。

>>> from unidecode import unidecode
>>> unidecode(u'\u0130le'.lower()) == 'ile'
True

編輯:正如user2357112所指出的,這與Python 2.7的unicode.lower()不匹配。 Python 2.7使用C庫函數towlower ,因此為了與該函數完全匹配,您需要使用一些C接口(例如Python 2.7本身,如mkiever的答案)。 但是,如果您不需要保留任何非ascii符號,則應該可以使用。

蠻力解決方案。

在Python2中創建一個較低的映射,然后在Python3中使用它。

Python2程序創建地圖:

f = open('py2_lower_map', 'w')

for i in range(256):
    for j in range(256):
        b = chr(j) + chr(i)
        try:
            low = b.decode('utf16').lower()
        except:
            low = str('?')
        f.write(low.encode('utf-8'))

f.close()

演示如何在Python3中使用地圖:

f = open('py2_lower_map', 'r', encoding='utf-8')
_py2_lower_map = f.read()
f.close()

def py2_lower(u):
    return ''.join(_py2_lower_map[ord(c)] for c in u)

low = py2_lower('İle')
print(low)
print([ord(c) for c in low])

說實話,這可能有粗糙的角落,快速而骯臟,但主要做正確的事情。 它適用於一個例子;-)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM