任意字符串到有效的Python名称

时间:2015-12-31 10:13:47

标签: python string python-2.7 python-2.x

我正在尝试基于外部数据自动生成Python代码。任务是将任意字符串转换为有效的Python名称。

我提出了紧凑的解决方案,这似乎在技术上是正确的:

import string

VALID_NAME_CHARACTERS = string.lowercase + string.uppercase + string.digits
PLACEHOLDER = "_"


def to_name(s):
    return ''.join(c.lower() if c in VALID_NAME_CHARACTERS else PLACEHOLDER for c in s).lstrip(string.digits)

一些测试用例:

assert to_name("abcd123") == "abcd123" 
assert to_name("Lorem ipsum dolor sit amet") == "lorem_ipsum_dolor_sit_amet"
assert to_name(u"unicode-żółć") == "unicode_____"
assert to_name("123abcd") == "abcd"  # currently code does this
assert to_name("123abcd") == "___abcd"  # although I'd like to behave it like this

我对字符串起始数字的数字处理不一致感到困扰。

是否有一种简单的方法可以使最后一个测试用例通过?

1 个答案:

答案 0 :(得分:0)

由于只禁止Python名称中的第一个字符为数字,因此我们只需要注意这种特殊情况。

import string

VALID_NAME_CHARACTERS = string.lowercase + string.uppercase + string.digits
PLACEHOLDER = "_"


def to_name(s):
    if s[0] in string.digits:
        s = PLACEHOLDER + s[1:]
    return ''.join(c.lower() if c in VALID_NAME_CHARACTERS else PLACEHOLDER for c in s)

所有测试用例都在传递,所有结果名称都是有效的Python标识符:

assert to_name("abcd123") == "abcd123" 
assert to_name("Lorem ipsum dolor sit amet") == "lorem_ipsum_dolor_sit_amet"
assert to_name(u"unicode-żółć") == "unicode_____"
assert to_name("123abcd") == "_23abcd"