簡體   English   中英

如何將一些任意字符串轉換為有效的人類可讀標識符?

[英]How to convert somewhat arbitrary strings to valid human-readable identifiers?

我有一長串人類可讀的字符串,其中一些包含一些非ASCII甚至非拉丁字符。

'Count €'  
'Contains äüöß'
'Y tu mamá también.'
'что'

但是,一個服務,我使用需要名稱只包含azAZ0-9. _ (空間)。

將這些名稱轉換為在這些要求下有效的唯一名稱的簡潔方法是什么?

我們希望盡可能地保持人類可讀性。 例如,理想情況下不要更改. full stop ,並且不改變&u38 我們不能簡單地丟棄無效的字符或變音符號。 例如:

'Count euro symbol'
'Contains a with umlaut u with umlaut o with umlaut sharp s'
'Y tu mama_ tambie_n.'
'cyrillic small letter che ...'

這里是約束:
-必須是Python(2和3)
-不必安裝軟件包
-必須保留唯一性(如果在某些情況下沒有唯一性就可以了)
-必須簡明扼要

(注意: 'Y tu mama tambien.'鑒於可能會打破唯一性約束,因此是不可接受的。)

將任意字符串轉換為有效的類名或標識符有一些相似之處。

谷歌搜索“ python字符名稱”將調出unicodedata模塊。 所以一個開始的地方就像

import string
import unicodedata

ALLOWED = set(string.ascii_letters + string.digits + '. _')
sentences = ['Count €', 'Contains äüöß', 'Y tu mamá también.', 'что']

def encode(s):
    return ''.join([unicodedata.name(c).replace(" ","_")+"_"
                   if c not in ALLOWED else c for c in s])

for s in sentences:
    print(s)
    print(encode(s))

這給了我

Count €
Count EURO_SIGN_
Contains äüöß
Contains LATIN_SMALL_LETTER_A_WITH_DIAERESIS_LATIN_SMALL_LETTER_U_WITH_DIAERESIS_LATIN_SMALL_LETTER_O_WITH_DIAERESIS_LATIN_SMALL_LETTER_SHARP_S_
Y tu mamá también.
Y tu mamLATIN_SMALL_LETTER_A_WITH_ACUTE_ tambiLATIN_SMALL_LETTER_E_WITH_ACUTE_n.
что
CYRILLIC_SMALL_LETTER_CHE_CYRILLIC_SMALL_LETTER_TE_CYRILLIC_SMALL_LETTER_O_

只需做更多的工作(為轉義選擇一個合適的定界符),就可以保證可以完美地往返,但這留給讀者練習。

暫無
暫無

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

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