[英]How to convert somewhat arbitrary strings to valid human-readable identifiers?
我有一长串人类可读的字符串,其中一些包含一些非ASCII甚至非拉丁字符。
'Count €'
'Contains äüöß'
'Y tu mamá también.'
'что'
但是,一个服务,我使用需要名称只包含az
, AZ
, 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.'
鉴于可能会打破唯一性约束,因此是不可接受的。)
将任意字符串转换为有效的类名或标识符有一些相似之处。
谷歌搜索“ 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.