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

时间:2016-11-28 14:50:02

标签: python unicode nlp naming-conventions naming

我有很长的人类可读字符串列表,其中一些包含一些非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.'是不可接受的。)

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

1 个答案:

答案 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_

只需要更多的工作(为逃生选择合适的分隔符),你可以保证这可以完美地往返,但这留给读者练习。