繁体   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