一、概念
正则表达式是一组由字母和符号组成的特殊文本,它可以用来从文本中找出满足你想要格式的句子。简单的讲就是按照某种规则去匹配符合条件的字符串
二、常见语法
1、字符相关
示例1:zlw匹配文本中的zlw
import re # 给定的文本 text = "sjaifhsfafizlw" res_list = re.findall('zlw', text) print(res_list) # 输出['zlw']
示例2:[zlw]匹配文本中的z或l或w
import re # 给定的文本 text = "sjaifhsfafizlw3133" res_list = re.findall('[zlw]', text) print(res_list) # 输出['z', 'l', 'w']
示例3:[^zlw]匹配除了zlw以外的其它字符
import re # 给定的文本 text = "sjaifafizlw31" res_list = re.findall('[^zlw]', text) print(res_list) # 输出['s', 'j', 'a', 'i', 'f', 'a', 'f', 'i', '3', '1']
示例4:[a-z]匹配a-z的任意字符
import re # 给定的文本 text = "sjaafizlw31" res_list = re.findall('[a-z]', text) print(res_list) # 输出['s', 'j', 'a', 'a', 'f', 'i', 'z', 'l', 'w']
示例5:[0-9]匹配0-9的任意数字
import re # 给定的文本 text = "s1jaa0fizlw31" res_list = re.findall('[0-9]', text) print(res_list) # 输出['1', '0', '3', '1']
示例6: . 表示匹配除了换行符任意的单个字符
.* 表示匹配任意单个字符后面可以是0/多个字符
.+表示匹配任意单个字符后面可以是1/多个字符
import re # 给定的文本 text = "s1jaa0fizlw31" res_list = re.findall('z.', text) print(res_list) # 输出['zl']
import re # 给定的文本 text = "s1jaa0fizlesw31lsw" res_list = re.findall('z.+w', text) #贪婪模式 print(res_list) # ['zlesw31lsw']
import re # 给定的文本 text = "s1jaa0fizlesw31lsw" res_list = re.findall('z.+?w', text) #非贪婪模式 print(res_list) # ['zlesw']
示例7:\w代指字母或数字或下划线(汉字)
import re # 给定的文本 text = "北京xyz 上海abc 北京mnu" res_list = re.findall("北京\w", text) print(res_list) # ['北京x', '北京m']
示例8:\d代指数字
import re # 给定的文本 text = "x8dkfjx9jfksdk9dsx1" res_list = re.findall("x\d", text) print(res_list) # ['x8', 'x9', 'x1']
示例9: \s 代指任意的空白符,包括空格、制表符等
import re # 给定的文本 text = "zlw123d jyy232d zlw323v" res_list = re.findall("d\s.", text) print(res_list) # ['d j', 'd z']
2、数量相关
示例1: * 表示重复0次或更多次
import re # 给定的文本 text = "你是一个人,你是一个好人" res_list = re.findall("个*人", text) print(res_list) # ['个人', '人']
示例2: + 重复1次或更多次
import re # 给定的文本 text = "你是一个人,你是一个好人,你是一个大好人" res_list = re.findall("个\w+人", text) print(res_list) # ['个好人', '个大好人']
示例3: ?重复0次或1次
import re # 给定的文本 text = "你是一个人,你是一个好人,你是一个大好人" res_list = re.findall("个\w?人", text) print(res_list) # ['个人', '个好人']
示例4: {n}表示重复n次
{n,}表示之前的字符至少出现n次
{m,n}表示之前的字符出现次数大于m次,小于n次
import re # 给定的文本 text = "12674767362,邮箱49374934@qq.com,4793437" res_list = re.findall("\d{10,15}", text) print(res_list) # ['12674767362']
import re # 给定的文本 text = "12674767362,邮箱49374934@qq.com,4793437" res_list = re.findall("\d{11}", text) print(res_list) # ['12674767362']
3、括号(分组)
示例1:提取数据区域(输出括号里面的内容)
如果是多个括号分成多组
import re # 给定的文本 text = "12674767362,邮箱49374934@qq.com,4793437" res_list = re.findall("(12674(\d{4}))", text) print(res_list) # [('126747673', '7673')]
import re # 给定的文本 text = "12674767362,邮箱49374934@qq.com,4793437" res_list = re.findall("(12674(\d{4}))", text) print(res_list) # [('126747673', '7673')]
示例2:获取指定区域+或条件
import re # 给定的文本 text = "1267476jyy7362,1267476zlw7362" res_list = re.findall("1267476(j\w{2}|z\w{2})", text) print(res_list) # ['jyy', 'zlw']
4、起始和结束
^ 表示开始
$ 表示结束
一般用于字符的校验
import re # 给定的文本 text = "abc1267476jyy7362,mnb1267476zlw7362" res_list = re.findall("^\d.*", text) print(res_list) # [] 匹配不到返回为空
import re # 给定的文本 text = "1267476jyy7362,mnb1267476zlw" res_list = re.findall(".*\d$", text) print(res_list) # [] 匹配不到返回为空
由于正则表达式中* . \ { } ( )等都具有特殊的含义,所以如果想要在正则中匹配这种指定的字符,需要转义
import re # 给定的文本 text = "我有{5}元钱" res_list = re.findall("有{5}元", text) print(res_list) # [] 匹配不到返回为空
转义之后
import re # 给定的文本 text = "我有{5}元钱" res_list = re.findall("有\{5\}元", text) print(res_list) # ['有{5}元']
5、python中的re模块
1、findall,获取匹配到的所有数据
import re # 给定的文本 text = "zbcdefgxyzxmn891235" res_list = re.findall("x.", text) print(res_list) # ['xy', 'xm']
2、match,从起始位置开始匹配,匹配成功返回一个对象,未见配成功返回None
import re # 给定的文本 text = "zbcdefgxyzxmn891235" res = re.match("x.", text) print(res_list) # None
3、search,浏览整个字符串去匹配第一个,未匹配成功返回None
import re # 给定的文本 text = "zbcdefgxyzxmn891235" obj = re.search("x.", text) res = obj.group() print(res) # xy
4、sub,替换匹配成功的位置
import re # 给定的文本 text = "zbcdefgxyzxmn891235" res = re.sub("x.", "99", text) print(res) # zbcdefg99z99n891235
5、split,根据匹配成功的位置分割
import re # 给定的文本 text = "zbcdefgxyzxmn891235" res = re.split("x.", text) print(res) # ['zbcdefg', 'z', 'n891235']
最后给大家安利一个正则表达式匹配工具,非常好用-regex101: build, test, and debug regexRegular expression tester with syntax highlighting, explanation, cheat sheet for PHP/PCRE, Python, GO, JavaScript, Java, C#/.NET, Rust.https://regex101.com/