当前位置: 首页 > 科技观察

用Python验证50个常用正则表达式

时间:2023-03-19 20:02:50 科技观察

00Python如何支持正则表达式?我使用python实现正则表达式并使用JupyterNotebook编写代码。Python通过re模块支持正则表达式,使得Python语言具备了所有的正则表达式功能。注意这里两个函数的使用:re.compile用于编译正则表达式,生成一个正则表达式(Pattern)对象;.findall用于查找字符串中所有与正则表达式匹配的子串并返回一个列表,如果没有找到则返回一个空列表。#导入re模块importre01邮箱包含大小写字母、下划线、阿拉伯数字、点、破折号表达式:[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(?:\.[a-zA-Z0-9_-]+)案例:pattern=re.compile(r"[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(?:\.[a-zA-Z0-9_-]+)")strs='我的私人邮箱是zhuwjwh@outlook.com,公司邮箱是123456@qq.org,请注册?'result=pattern.findall(strs)print(result)['zhuwjwh@outlook.com','123456@qq.org']02身份证号码xxxxxxyyyyMMdd3750十八位区域:[1-9]首位\d{5}年的两位数:(18|19|([23]\d))1800-2399年的最后两位数:\d{2}月:((0[1-9])|(10|11|12))天数:(([0-2][1-9])|10|20|30|31)闰年不能禁止29+三位序号:\d{3}两位数序列代码:\d{2}校验码:[0-9Xx]表达式:[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]大小写:模式=re.compile(r[1-9]\d{5}(?:18|19|(?:[23]\d))\d{2}(?:(?:0[1-9])|(?:10|11|12))(?:(?:[0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]")strs='小明的身份证号码是342623198910235163,手机号码是13987692110'result=pattern.findall(strs)print(result)['342623198910235163']03国内手机号码都是11位数字开头1、第二位一般为3、5、6、7、8、9,其余八位为任意数。例如:13987692110、15610098778表达式:1(3|4|5|6|7|8|9)\d{9}案例:pattern=re.compile(r"1[356789]\d{9}")strs='小明的手机号码是13987692110,你明天给他打电话result=pattern.findall(strs)print(result)['13987692110']04国内座机区号3~4位,号码7~8位例如:0511-1234567、021-87654321表达式:\d{3}-\d{8}|\d{4}-\d{7}案例:pattern=re.compile(r"\d{3}-\d{8}|\d{4}-\d{7}")strs='0511-1234567是小明的电话,他的办公电话是021-87654321'result=pattern.findall(strs)print(result)['0511-1234567','021-87654321']05域名中包含http:\\或https:\\表达式:(?:(?:http:\/\/)|(?:https:\/\/))?(?:[\w](?:[\w\-]{0,61}[\w])?\.)+[a-zA-Z]{2,6}(?:\/)案例:pattern=re.compile(r"(?:(?:http:\/\/)|(?:https:\/\/))?(?:[\w](?:[\w\-]{0,61}[\w])?\.)+[a-zA-Z]{2,6}(?:\/)")strs='Python官网网址为https://www.python.org/'result=pattern.findall(strs)print(result)['https://www.python.org/']06IP地址IP的长度地址为32位(共2^32个IP地址),分为4段,每段8位,每段用0到255范围内的十进制数表示,段之间用句点分隔表达式:((?:(?:25[0-5]|2[0-4]\d|[01]?\d?\d)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d?\d))案例:pattern=re.compile(r"((?:(?:25[0-5]|2[0-4]\d|[01]?\d?\d)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d?\d))")strs='''请输入合法IP地址,非法IP地址及其他字符将被过滤!添加、删除或更改IP地址后,请保存并关闭记事本!192.168.8.84192.168.8.85192.168.8.860.0.0.1256.1.1.1192.256.256.256192.255.255.255aa.bb.cc.dd'''result=pattern.findall(strs)print(result)['192.168',.8.8'192.168.8.85','192.168.8.86','0.0.0.1','56.1.1.1','192.255.255.255']07日期常用日期格式:yyyyMMdd,yyyy-MM-dd,yyyy/MM/dd,yyyy.MM.dd表达式:\d{4}(?:-|\/|.)\d{1,2}(?:-|\/|.)\d{1,2}案例:pattern=re.compile(r"\d{4}(?:-|\/|.)\d{1,2}(?:-|\/|.)\d{1,2}")strs='今天是2020/12/20,去年的今天是2019.12.20,明年的今天是2021-12-20'result=pattern.findall(strs)print(result)['2020/12/20','2019.12.20','2021-12-20']08国内邮政编码中国邮政编码采用四级六位代码结构,前两位表示省(市、a自治区)第三位数字表示邮区;第四位数字表示县(市)最后两位表示派送所(地)表达式:[1-9]\d{5}(?!\d)案例:pattern=re.compile(r"[1-9]\d{5}(?!\d)")strs='上海市静安区邮编为200040'result=pattern.findall(strs)print(result)['200040']09password6~18之间,只能包含字母、数字和下划线)expression:[a-zA-Z]\w{5,17}strongsecret代码(以字母开头,必须包含大小写字母和数字的组合,不能使用特殊字符,长度在8-10之间)表达式:[a-zA-Z](?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}pattern=re.compile(r"[a-zA-Z]\w{5,17}")strs='密码:q123456_abc'result=pattern.findall(strs)print(result)['q123456_abc']pattern=re.compile(r"[a-zA-Z](?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}")strs='强密码:q123456ABc,弱密码:q123456abc'result=pattern.findall(strs)print(result)['q123456ABc,']10汉字表达式:[\u4e00-\u9fa5]case:pattern=re.compile(r[\u4e00-\u9fa5]")strs='apple:Apple'result=pattern.findall(strs)print(result)['苹果','果']11号验证数:^[0-9]*$验证n位数字:^\d{n}$验证至少n位数字:^\d{n,}$验证m-n位数字:^\d{m,n}$验证开头的零和非零数:^(0|[1-9][0-9]*)$验证正数带两位小数的实数:^[0-9]+(.[0-9]{2})?$验证带1-3位小数的正实数:^[0-9]+(.[0-9]{1,3})?$验证非零正整数:^\+?[1-9][0-9]*$验证非零负整数:^\-[1-9][0-9]*$验证非-negativeInteger(PositiveInteger+0)^\d+$验证非正整数(NegativeInteger+0)^((-\d+)|(0+))$Integer:^-?\d+$Non-negativeFloat(正浮点数+0):^\d+(\.\d+)?$正浮点数^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$非正浮点数(负浮点数+0)^((-\d+(\.\d+)?)|(0+(\.0+)?))$负浮点数^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$浮动^(-?\d+)(\.\d+)?$12字符串英文和数字:^[A-Za-z0-9]+$或^[A-Za-z0-9]{4,40}$所有长度都是3-20字符:^.{3,20}$由26个英文字母组成的字符串:^[A-Za-z]+$由26个大写英文字母组成的字符串:^[A-Z]+$由26个字符组成的字符串小写英文字母:^[a-z]+$由数字和26个英文字母组成的字符串:^[A-Za-z0-9]+$由数字、26个英文字母或下划线组成的字符字符串:^\w+$或者^\w{3,20}$中文、英文、数字包括下划线:^[\u4E00-\u9FA5A-Za-z0-9_]+$中文、英文、数字但不包括下划线等符号:^[\u4E00-\u9FA5A-Za-z0-9]+$或^[\u4E00-\u9FA5A-Za-z0-9]{2,20}$可以输入包含^%&',;=?$\"等字符:`[^%&',;=?$\x22]+`禁止输入包含~的字符:[^~\x22]+附:正则表达式语法详解\:标记下一个字符一个特殊字符(FileFormatEscape,列表见此表),或一个文字字符(IdentityEscape,共有^$()*+?.[{|12个),或一个反向引用(反向引用)或八进制转义字符例如,“n”匹配字符“n”。“\n”匹配换行符。序列“\\”匹配“\”,“\(”匹配“(”。^:匹配输入字符串的开头$:匹配输入字符串的结尾*:匹配前面的子表达式零次或多次。例如,zo*匹配“z”、“zo”和“zoo”。*等同于{0,}。+:匹配前面的子表达式一次或多次。例如,“zo+”匹配“zo”和“zoo”,但不匹配“z”。+等同于{1,}。?:匹配前面的子表达式零次或一次。例如,“做(是)吗?”将匹配“does”中的“do”和“does”。?相当于{0,1}。{n}:n为非负整数。匹配确定n次。例如,“o{2}”不会匹配“Bob”中的“o”,但会匹配“food”中的两个o。{n,}:n为非负整数。至少匹配n次。例如,“o{2,}”不会匹配“Bob”中的“o”,但会匹配“foooood”中的所有o。“o{1,}”等同于“o+”。“o{0,}”等同于“o*”。{n,m}:m和n都是非负整数,n<=m。最少匹配n次,最多匹配m次。例如,“o{1,3}”将匹配“fooooood”中的前三个o。“o{0,1}”等同于“o?”。请注意,逗号和两个数字之间不能有空格。?:非贪婪量词(Non-greedyquantifiers):当字符紧跟在任何其他重复修饰符(*,+,?,{n},{n,},{n,m})之后时,匹配的模式是“非”贪心。非贪婪模式尽可能少地匹配搜索字符串,而默认的贪婪模式尽可能多地匹配搜索字符串。例如,对于字符串“oooo”、“o+?”将匹配单个“o”,而“o+”将匹配所有“o”。.:匹配除“\r”“\n”以外的任意单个字符。要匹配包括“\r”“\n”在内的任何字符,请使用类似“(.\|\r\|\n)”的模式。(pattern):匹配模式,得到匹配的子串。此子字符串用于反向引用。获取的匹配项可以从生成的Matches集合中获取,在VBScript中使用SubMatches集合,在JScript中使用$0...$9属性。要匹配括号字符,请使用“\(”或“\)”。数量后缀是可选的。(?:pattern):匹配pattern但没有得到匹配的子串(shygroups),也就是说这是一个非获取匹配,不存储匹配的子串用于反向引用。这对于使用或字符“(\|)”组合模式的各个部分很有用。例如,“industr(?:y\|ies)”是比“industry\|industries”更短的表达式。(?=pattern):向前看正向断言,匹配任何字符串匹配模式开头的搜索字符串。这是一个非获取匹配,即匹配不需要获取以备后用。例如,“Windows(?=95\|98\|NT\|2000)”匹配“Windows2000”中的“Windows”,但不匹配“Windows3.1”中的“Windows”。Lookaheads不消耗字符,也就是说,在匹配发生后,搜索下一个匹配项会在最后一个匹配项之后立即开始,而不是在包含lookahead的字符之后。(?!pattern):否定断言,匹配任何不匹配模式的字符串开头的搜索字符串。这是一个非获取匹配,即匹配不需要获取以备后用。例如“Windows(?!95\|98\|NT\|2000)”可以匹配“Windows3.1”中的“Windows”,但不能匹配“Windows2000”中的“Windows”。Lookahead不消耗字符,即发生匹配后,在上一次匹配后立即开始搜索下一个匹配,而不是在包含lookahead(?<=pattern)的字符之后:reverse(lookbehind)positivepre-check,类似于positive正向预检,但方向相反。例如,“(?<=95\|98\|NT\|2000)Windows”匹配“2000Windows”中的“Windows”,但不匹配“3.1Windows”中的“Windows”。(?