我正在尝试基于外部数据自动生成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
我对字符串起始数字的数字处理不一致感到困扰。
是否有一种简单的方法可以使最后一个测试用例通过?
答案 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"