我有很长的人类可读字符串列表,其中一些包含一些非ASCII甚至非拉丁字符。
'Count €'
'Contains äüöß'
'Y tu mamá también.'
'что'
但我使用的服务要求名称仅包含a-z
,A-Z
,0-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.'
是不可接受的。)
将任意字符串转换为有效的类名或标识符有一些相似之处。
答案 0 :(得分:3)
谷歌搜索"蟒蛇角色名称"调出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_
只需要更多的工作(为逃生选择合适的分隔符),你可以保证这可以完美地往返,但这留给读者练习。