[编辑]还有一个解决方案尚未提及,而且在大多数情况下,它似乎比目前给出的其他解决方案要好。
使用string.translate替换字符串中的所有有效字符,并查看是否有剩余的无效字符。这相当快,因为它使用底层C函数来完成工作,只涉及很少的python字节码。
显然,性能并不是万能的——如果不是在性能关键的代码路径中,寻找最可读的解决方案可能是最好的方法,但是为了看看解决方案是如何堆叠的,下面是到目前为止提出的所有方法的性能比较。check_trans是使用string.translate方法的。
测试代码:import string, re, timeit
pat = re.compile('[\w-]*$')
pat_inv = re.compile ('[^\w-]')
allowed_chars=string.ascii_letters + string.digits + '_-'
allowed_set = set(allowed_chars)
trans_table = string.maketrans('','')
def check_set_diff(s):
return not set(s) - allowed_set
def check_set_all(s):
return all(x in allowed_set for x in s)
def check_set_subset(s):
return set(s).issubset(allowed_set)
def check_re_match(s):
return pat.