判断字母数字下划线python_如何验证字符串只包含字母、数字、下划线和破折号?...
[编辑]还有一个解决方案尚未提及,而且在大多数情况下,它似乎比目前给出的其他解决方案要好。
使用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))
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_如何验证字符串只包含字母、数字、下划线和破折号?...相关推荐
- 判断字母数字下划线python_如何验证Python中的字符串仅包含字母,数字,下划线和破折号?...
您可以使用正则表达式来完成此任务.为了验证字符串仅包含字母,数字,下划线和破折号,我们可以使用以下正则表达式:" ^ [A-Za-z0-9 _-] * $". 示例import r ...
- java用正则表达式判断字符串中是否仅包含英文字母、数字和汉字_灵思致远Leansmall的博客-CSDN博客_java判断字符串只包含数字字母
import java.util.regex.Matcher; import java.util.regex.Pattern;public class StrValidate {// 纯数字priva ...
- JavaScript验证字符串只能包含数字或者英文字符的代码实例
验证字符串只能包含数字或者英文字符的代码实例: 本章节分享一段代码实例,它实现了验证字符串内容是否只包含英文字符或者数字. 代码实例如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 ...
- python判断英文字母_python判断字符串是否包含字母
第一种方法:使用正则表达式判断字符串是否包含字母#-*- coding:utf-8 -*-import re def check(str): my_re = re.compile(r'[A-Za-z] ...
- python判断字符是英文字母怎么回事_python判断字符串是否包含字母
第一种方法:使用正则表达式判断字符串是否包含字母#-*- coding:utf-8 -*-import re def check(str): my_re = re.compile(r'[A-Za-z] ...
- Java判断字符串只含有四位数字
String regex = "^\d{4}$"; Pattern pattern = Pattern.compile(regex); Matcher matcher = patt ...
- puts遇到空格无法输出_输入一句英文,只包含字母和空格,如何输出这句英文中.....-黑马程序员技术交流社区...
//输入一句英文,只包含字母和空格,如何输出这句英文中的最长单词?再把每个单词的首字母转换成大写! #include #include int main(int argc, const char * ...
- C语言试题五十七之假定输入的字符串中只包含字母和*号。请编写函数function,它的功能是:删除字符串中所有*号。在编写函数时,不得使用c语言提供的字符串函数。
1. 题目 假定输入的字符串中只包含字母和*号.请编写函数function,它的功能是:删除字符串中所有*号.在编写函数时,不得使用c语言提供的字符串函数. 2 .温馨提示 C语言试题汇总里可用于计算 ...
- C语言试题四十二之假定输入的字符串中只包含字母和*号。请编写函数fun,它的功能是:将字符串中的前导*号全部移到字符串的尾部。
1. 题目 请编写一个函数function,它的功能是:假定输入的字符串中只包含字母和*号,它的功能是:将字符串中的前导*号全部移到字符串的尾部. 2 .温馨提示 C语言试题汇总里可用于计算机二级C语 ...
最新文章
- .NET:命令行解析器介绍
- java 为什么序列化_java类为什么要序列化
- 使用svnsync同步svn
- 作者:吕红胤,女,电子科技大学副研究员。
- OJ1057: 素数判定(C语言经典列题,判断变量的应用)
- amos调节变量怎么画_AMOS 中验证性因素分析(CFA)
- 如何下载安装Photoshop cs 6(供新手)
- 101个Google技巧——Google技巧的终极收集
- python中大于0的元素全部转化为1,小于0的元素全部转化为0的代码
- 鸟哥的Linux私房菜第零章
- Github删除一个无用库
- bay——RAC 表空间时数据文件误放置到本地文件系统-介质恢复.txt
- 项目分析-纷享车链AutoChain的数据保险柜解读
- NVIDIA控制面板打不开
- 文献中数学公式规范复制工具——Mathpix Snip
- xml转json的两种方法
- word转换成pdf后图片压缩失真的解决方法
- html改变按钮形状6,6个HTML5/CSS3按钮悬停边界旋绕动画
- 安装运行太极框架Android搞机操作root
- 《摔跤吧爸爸》观后感