一、什么是正则表达式
正则表达式又称规则表达式。(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。
python对于正则表达式的支持还是比较方便的,使用前导入re包就可以了。
二、正则表达式语法
2.1 [] 表示一个字符,该字符是[]中指定的内容
[a-z] 该字符是任意小写字母 [A-Z] 该字符是任意大写字母 [a-zA-Z0-9] 该字符任意字母或者数字
2.2 预定义字符(注意大小写)
. :表示匹配任意1个字符(除了\n) \.匹配点本身 \d :表示匹配数字,等同于[0-9] \w :表示单词字符,等同于[a-zA-Z0-9_] \s :表示空格或者tab \D :表示匹配非数字 \W :表示匹配非单词字符 \S :表示匹配非空格
2.3 数量匹配
*:表示匹配前一个规则字符出现0-无数次 +:表示匹配前一个规则字符至少出现1次-无数次 ?:表示匹配前一个规则字符出现0或者1次 {m}:表示匹配前一个规则字符出现m次 {m,}:表示匹配前一个规则字符至少出现m次 {m,n}:表示匹配前一个规则字符出现m-n次
2.4 边界匹配
^:表示匹配字符串开头 $:表示匹配字符串结尾 \b:表示匹配一个单词边界 \B:表示匹配非单词边界
2.4 分组匹配
|:匹配左右任意一个表达式 ():将括号中的字符作为一个分组
三、代码示例
3.1 基础匹配
""" 这里是正则表达式的代码示例,需要导re包 正则表达式re模块的基本匹配方法 """ import re # 1. match 从头匹配第一个命中项 str1 = "python is a good language python1!" # str11 = "1 python is a good language python1!" res = re.match("python", str1) print(type(res)) print(res) # 如果是str11,因为从头开始就不匹配,所以返回None print(res.span()) # 获取匹配的开始下标到结束下标,不包含右边界 print(res.group()) # 获取匹配的结果 # 运行结果: # <class 're.Match'> # <re.Match object; span=(0, 6), match='python'> print("===================== 分割线1 ==================== ") res = re.match("python1", str1) print(type(res)) print(res) # None,因为match是从头开始匹配,即使字符串中有python1,也不能匹配 print("===================== 分割线2 ==================== ") # 2. serach 全局匹配,匹配第一个命中项 str2 = "dwadwa python is a good language python1 python !" res2 = re.search("python", str2) print(type(res2)) print(res2) print(res2.span()) # 返回第一个匹配到的其实下标和右边界 print(res2.group()) # 获取匹配的结果 print("===================== 分割线3 ==================== ") # 3. findall 全局匹配,匹配所有满足项 str3 = "dwadwa python is a good language python1 python dwadadpythonwad python!" res3 = re.findall("python", str3) print(res3)
3.2 元字符匹配
""" Python 正则表达式 元字符匹配代码示例 """ import re str1 = "dwada @@ 163 qq #?!!! 789" # 字符串前面带r 表示转义字符无效 # 找所有在a-z F-Z 0-9的字符 res1 = re.findall(r'[a-zF-Z0-9]', str1) print(res1) # 只找0-9的数字 res1 = re.findall(r'[0-9]', str1) print(res1) print("===================== 分割线1 ==================== ") # 2,匹配账号,只能由数字和字母组成,长度限制6-10位 str2 = "hdjskahdkjshakdhas" res2 = re.findall(r'^[0-9a-zA-Z]{6,10}$', str2) print(res2) str2 = "hdj121ska" res2 = re.findall(r'^[0-9a-zA-Z]{6,10}$', str2) print(res2) print("===================== 分割线2 ==================== ") # 2,匹配qq号, 只能由数字组成,长度在5-11,第一位不能是0 # 说明:第一位限制在1-9,剩下的4-10位限制在0-9 {4,10}限定剩余的长度 rule = '^[1-9][0-9]{4,10}$' str3 = "01255306110" res3 = re.findall(rule, str3) print(res3) print("===================== 分割线3 ==================== ") # 3.匹配邮箱,只允许 qq 163 gmail 三种邮箱地址 # 1125530610@qq.com # 邮箱的格式: xxx.xxx.xxx.xxx.xxx@xxx.xxx.xxx # 说明:[\w-]+ 表示所有的数字 a-z A-Z _ -的集合 +号表示至少出现一次 # (\.[\w-]+)* 表示.xxx *表示可以出现0到无数次 # (qq|163|gmail) 三者选一 # (\.[\w-]+)+ 表示该.xxx 至少出现一次 rule4 = '[\w-]+(\.[\w-]+)*@(qq|163|gmail)(\.[\w-]+)+' str4 = "1125530610@qq.com" str5 = "1125530610.xxx@qq.com" res4 = re.findall(rule4, str4) print(res4) res4 = re.findall(rule4, str5) print(res4) rule41 = r'(^[\w-]+(\.[\w-]+)*@(qq|163|gmail)(\.[\w-]+)+$)' str4 = "1125530610@qq.com" str5 = "1125530610.xxx@qq.com" res4 = re.findall(rule41, str4) print(res4) res4 = re.findall(rule41, str5) print(res4)