如何将任意字符串转换为有效的人类可读标识符?

2024-04-27 12:00:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一长串人类可读的字符串,其中一些包含一些非ASCII甚至非拉丁字符。你知道吗

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

但是我使用的服务要求名称只由a-zA-Z0-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.'不可接受,因为有可能打破唯一性约束。)

将任意字符串转换为有效的类名或标识符有一些相似之处。你知道吗


Tags: 字符串名称countwithascii情况人类字符
1条回答
网友
1楼 · 发布于 2024-04-27 12:00:32

google“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_

只需再多做一点工作(为转义选择一个合适的分隔符),您就可以保证这可以完美地进行往返,但这只是留给读者的一个练习。你知道吗

相关问题 更多 >