将任意字符串转换为有效的Python名称

将任意字符串转换为有效的Python名称,python,string,python-2.7,python-2.x,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_C

我正在尝试基于外部数据自动生成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
我有点担心字符串起始数字上的数字处理不一致


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

因为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"

由于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"

只需将第0位的数字替换为下划线即可使其成为有效标识符,因此只需在一行之前添加特殊情况,并删除
lstrip
<如果您希望对有效标识符进行最小的更改,则代码>到名称(“123abcd”)的结果应为
“\u 23abcd”
。您只需将第0位的数字替换为下划线即可使其成为有效标识符,因此只需在一行之前添加特殊情况,并删除
lstrip
<假设您希望对有效标识符进行最小的更改,则代码>到名称(“123abcd”)的结果应为
“\u 23abcd”
。python关键字(如
if
)如何?Stdlib包含的模块应足以检测字符串是否为关键字并正确处理它。但是对于我的输入数据没有发生:)python关键字如何,例如
if
?Stdlib包含的模块应该足以检测字符串是否是关键字并正确处理它。但我的输入数据没有发生:)