簡體   English   中英

如何迭代unicode符號,而不是python中的字節?

[英]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中的組合字符:

對於包含組合字符的許多字符,有一個組合分解形式的寫入它,組成一個代碼點,並分解兩個(或更多?)代碼點的序列:

c與cedilla的組合和分解形式

參見U + 00E7U + 0063U + 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.

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