[编辑]还有一个解决方案尚未提及,而且在大多数情况下,它似乎比目前给出的其他解决方案要好。

使用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.match(s)

def check_re_inverse(s): # Search for non-matching character.

return not pat_inv.search(s)

def check_trans(s):

return not s.translate(trans_table,allowed_chars)

test_long_almost_valid='a_very_long_string_that_is_mostly_valid_except_for_last_char'*99 + '!'

test_long_valid='a_very_long_string_that_is_completely_valid_' * 99

test_short_valid='short_valid_string'

test_short_invalid='/$%$%&'

test_long_invalid='/$%$%&' * 99

test_empty=''

def main():

funcs = sorted(f for f in globals() if f.startswith('check_'))

tests = sorted(f for f in globals() if f.startswith('test_'))

for test in tests:

print "Test %-15s (length = %d):" % (test, len(globals()[test]))

for func in funcs:

print " %-20s : %.3f" % (func,

timeit.Timer('%s(%s)' % (func, test), 'from __main__ import pat,allowed_set,%s' % ','.join(funcs+tests)).timeit(10000))

print

if __name__=='__main__': main()

我的系统上的结果是:Test test_empty (length = 0):

check_re_inverse : 0.042

check_re_match : 0.030

check_set_all : 0.027

check_set_diff : 0.029

check_set_subset : 0.029

check_trans : 0.014

Test test_long_almost_valid (length = 5941):

check_re_inverse : 2.690

check_re_match : 3.037

check_set_all : 18.860

check_set_diff : 2.905

check_set_subset : 2.903

check_trans : 0.182

Test test_long_invalid (length = 594):

check_re_inverse : 0.017

check_re_match : 0.015

check_set_all : 0.044

check_set_diff : 0.311

check_set_subset : 0.308

check_trans : 0.034

Test test_long_valid (length = 4356):

check_re_inverse : 1.890

check_re_match : 1.010

check_set_all : 14.411

check_set_diff : 2.101

check_set_subset : 2.333

check_trans : 0.140

Test test_short_invalid (length = 6):

check_re_inverse : 0.017

check_re_match : 0.019

check_set_all : 0.044

check_set_diff : 0.032

check_set_subset : 0.037

check_trans : 0.015

Test test_short_valid (length = 18):

check_re_inverse : 0.125

check_re_match : 0.066

check_set_all : 0.104

check_set_diff : 0.051

check_set_subset : 0.046

check_trans : 0.017

在大多数情况下,translate方法似乎是最好的,对于长有效字符串来说尤其如此,但是在test_long_in valid中被正则表达式击败(可能是因为正则表达式可以立即退出,但是translate总是必须扫描整个字符串)。set方法通常是最糟糕的,仅在空字符串情况下优于regex。

如果提前退出,则使用all(x in allowed_set for x in s)性能良好,但如果必须遍历每个字符,则可能不好。isSubSet和set difference是可比较的,并且始终与字符串的长度成正比,而与数据无关。

匹配所有有效字符的regex方法和搜索无效字符的regex方法之间也有类似的区别。当检查一个很长但完全有效的字符串时,匹配的性能稍好一些,但对于字符串末尾附近的无效字符则较差。

判断字母数字下划线python_如何验证字符串只包含字母、数字、下划线和破折号?...相关推荐

  1. 判断字母数字下划线python_如何验证Python中的字符串仅包含字母,数字,下划线和破折号?...

    您可以使用正则表达式来完成此任务.为了验证字符串仅包含字母,数字,下划线和破折号,我们可以使用以下正则表达式:" ^ [A-Za-z0-9 _-] * $". 示例import r ...

  2. java用正则表达式判断字符串中是否仅包含英文字母、数字和汉字_灵思致远Leansmall的博客-CSDN博客_java判断字符串只包含数字字母

    import java.util.regex.Matcher; import java.util.regex.Pattern;public class StrValidate {// 纯数字priva ...

  3. JavaScript验证字符串只能包含数字或者英文字符的代码实例

    验证字符串只能包含数字或者英文字符的代码实例: 本章节分享一段代码实例,它实现了验证字符串内容是否只包含英文字符或者数字. 代码实例如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 ...

  4. python判断英文字母_python判断字符串是否包含字母

    第一种方法:使用正则表达式判断字符串是否包含字母#-*- coding:utf-8 -*-import re def check(str): my_re = re.compile(r'[A-Za-z] ...

  5. python判断字符是英文字母怎么回事_python判断字符串是否包含字母

    第一种方法:使用正则表达式判断字符串是否包含字母#-*- coding:utf-8 -*-import re def check(str): my_re = re.compile(r'[A-Za-z] ...

  6. Java判断字符串只含有四位数字

    String regex = "^\d{4}$"; Pattern pattern = Pattern.compile(regex); Matcher matcher = patt ...

  7. puts遇到空格无法输出_输入一句英文,只包含字母和空格,如何输出这句英文中.....-黑马程序员技术交流社区...

    //输入一句英文,只包含字母和空格,如何输出这句英文中的最长单词?再把每个单词的首字母转换成大写! #include #include int main(int argc, const char * ...

  8. C语言试题五十七之假定输入的字符串中只包含字母和*号。请编写函数function,它的功能是:删除字符串中所有*号。在编写函数时,不得使用c语言提供的字符串函数。

    1. 题目 假定输入的字符串中只包含字母和*号.请编写函数function,它的功能是:删除字符串中所有*号.在编写函数时,不得使用c语言提供的字符串函数. 2 .温馨提示 C语言试题汇总里可用于计算 ...

  9. C语言试题四十二之假定输入的字符串中只包含字母和*号。请编写函数fun,它的功能是:将字符串中的前导*号全部移到字符串的尾部。

    1. 题目 请编写一个函数function,它的功能是:假定输入的字符串中只包含字母和*号,它的功能是:将字符串中的前导*号全部移到字符串的尾部. 2 .温馨提示 C语言试题汇总里可用于计算机二级C语 ...

最新文章

  1. .NET:命令行解析器介绍
  2. java 为什么序列化_java类为什么要序列化
  3. 使用svnsync同步svn
  4. 作者:吕红胤,女,电子科技大学副研究员。
  5. OJ1057: 素数判定(C语言经典列题,判断变量的应用)
  6. amos调节变量怎么画_AMOS 中验证性因素分析(CFA)
  7. 如何下载安装Photoshop cs 6(供新手)
  8. 101个Google技巧——Google技巧的终极收集
  9. python中大于0的元素全部转化为1,小于0的元素全部转化为0的代码
  10. 鸟哥的Linux私房菜第零章
  11. Github删除一个无用库
  12. bay——RAC 表空间时数据文件误放置到本地文件系统-介质恢复.txt
  13. 项目分析-纷享车链AutoChain的数据保险柜解读
  14. NVIDIA控制面板打不开
  15. 文献中数学公式规范复制工具——Mathpix Snip
  16. xml转json的两种方法
  17. word转换成pdf后图片压缩失真的解决方法
  18. html改变按钮形状6,6个HTML5/CSS3按钮悬停边界旋绕动画
  19. 安装运行太极框架Android搞机操作root
  20. 《摔跤吧爸爸》观后感

热门文章

  1. 海进计算机的游戏,到海洋深处电脑版
  2. 自动驾驶汽车将如何影响未来的城市生活
  3. Python—飞机大作战游戏(附源代码及素材)
  4. python做的项目管理软件有哪些_大家都在用哪些在线的项目管理工具?
  5. 【BIM初学】1、处理图纸
  6. RHCE(一)--- at、crontab、网卡绑定
  7. UML建模(一):UML图及事物关系
  8. 遥望南方的童年-观后感
  9. 吃鸡登录界面一直服务器维护,绝地求生正式服停机维护到几点?吃鸡进不去怎么办?...
  10. 如何快速注册google邮箱