[英]How do I iterate through unicode symbols, not bytes in python?
鑒於像u'кни́га'
這樣的重音單詞,我需要刪除急性( u'книга'
),並將重音格式更改為u'кни+га'
,其中'+'
代表前一個字母的尖銳。
我現在所做的是使用一個有效且無法完成符號的字典:
accented_list = [u'я́', u'и́', u'ы́', u'у́', u'э́', u'а́', u'е́', u'ю́', u'о́']
regular_list = [u'я', u'и', u'ы', u'у', u'э', u'а', u'е', u'ю', u'о']
accent_dict = dict(zip(accented_list, regular_list))
我想做這樣的事情:
def changeAccentFormat(word):
for letter in accent_dict:
if letter in word:
its_index = word.index(letter)
word = word[:its_index + 1] + u'+' + word[its_index + 1:]
return word
但是,它當然不能按預期工作。 我注意到這段代碼:
>>> word = u'кни́га'
>>> for letter in word:
... print letter
給
к
н
и
´
г
а
(好吧,我沒想到會出現空白符號,但仍然如此)。 所以我想知道,制作[u'к', u'н', u'и́', u'г', u'а']
的最簡單方法是什么? 或者也許有一些方法可以解決我的問題沒有它?
首先,關於迭代字符而不是字節,你已經做得對了 - 你的word
是unicode對象,而不是編碼的字節串。
現在,對於Unicode中的組合字符:
對於包含組合字符的許多字符,有一個組合和分解形式的寫入它,組成一個代碼點,並分解兩個(或更多?)代碼點的序列:
參見U + 00E7 , U + 0063和U + 0327
所以在Python中,你可以寫任何一個表單,它會在顯示時被組合成同一個字符:
>>> combining_cedilla = u'\u0327'
>>> c_with_cedilla = u'\u00e7'
>>> letter_c = u'\u0063'
>>>
>>> print c_with_cedilla
ç
>>> print letter_c + combining_cedilla
ç
要在組合形式和分解形式之間進行轉換,可以使用unicodedata.normalize()
:
>>> import unicodedata
>>> comp = unicodedata.normalize('NFC', letter_c + combining_cedilla)
>>> decomp = unicodedata.normalize('NFD', c_with_cedilla)
>>>
>>> print comp
ç
>>> print decomp
ç
( NFC
代表“正常形式C”(組成), NFD
代表“正常形式D”(分解)。
它們仍然是不同的形式 - 一個包含一個代碼點,另一個包含兩個:
>>> comp == decomp
False
>>> len(comp)
1
>>> len(decomp)
2
然而,在你的情況下,根本不似乎是小寫組合字符и
有口音,急性(有一個и
帶有口音的墳墓 )
Acutes由代碼點301, COMBINING ACUTE ACCENT
ACUTE COMBINING ACUTE ACCENT
,因此簡單的字符串字符替換就足夠了:
>>>print u'кни́га'.replace(u'\u0301', "+")
кни+га
如果您遇到未使用組合重音編碼的重音字符, unicodedata.normalize應該可以解決問題
您可以使用正則表達式模塊生成[u'к', u'н', u'и́', u'г', u'а']
。
以下是每個用戶感知角色所擁有的詞:
>>> import regex
>>> word = u'кни́га'
>>> len(word)
6
>>> regex.findall(r'\X', word)
['к', 'н', 'и́', 'г', 'а']
>>> len(regex.findall(r'\X', word))
5
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.