什么是正则表达式
正则表达式(regular expression)描述了一种字符串匹配的模式
1、比如:检索一个串是否含有某种子串(检索)
2、比如:匹配的子串做替换(替换)
3、比如:从一个串中取出符合某个条件的子串(提取)
模式:一种特定的字符串模式,这个模式是通过一些特殊的符号组成的
功能
① 数据验证(表单验证、如手机、邮箱、IP地址)
② 数据检索(数据检索、数据抓取) => 爬虫功能
③ 数据隐藏(135****6235 王先生)
④ 数据过滤(论坛敏感关键词过滤) …
目的
用于校验, 匹配数据的, 判断数据是否符合 我们指定的 规则.
用法
1. 导包. import re
2. 正则匹配.
result = re.match(正则表达式, 要校验的字符串, 额外功能:例如忽略大小写 多行模式等) 匹配的意思, 从左往右依次逐个匹配.
result = re.search(正则表达式, 要校验的字符串, 额外功能:例如忽略大小写 多行模式等) 查找的意思, 任意的一段能匹配上即可.
result = re.compile(pattern=正则表达式).sub('用来替换的内容', '要被替换的字符串')
3. 获取匹配结果. result.group() 获取匹配结果, 分组编号不写, 默认是: 0
规则如下
正则规则如下:
单个字符:
. 代表: 任意一个字符,\n除外
\. 代表: 1个普通的, 即取消.的特殊作用
[abc] 代表: a b c中的任意一个字符
[^abc] 代表: 除了 a b c中的任意一个字符
\d 代表: 任意的一个数字, 等价于: 0-9
\D 代表: 非数字
\w 代表: 非特殊字符(单词字符),a-z,A-Z,0-9,_(下划线),汉字
\W 代表: 特殊字符,非字母,非数字,非汉字,非下划线
\s 代表: 空白,即空格,tab键,\n等
\S 代表: 非空白
多个字符:
^ 代表: 开头
$ 代表: 结尾
* 代表: 前面的内容 ,至少出现0次,至多出现无数次
+ 代表: 1次 或者 多次
? 代表: 0次 或者 1次
{n} 代表: 恰好n次,多一次少一次都不行
{n,} 代表: 至少n次
{n,m} 代表: 至少n次,至多m次,包括 n和 m
分组:
| 表示或者的意思 , 多组正则能匹配任意一组即可
(ab) 表示分组 , 分组编号从1开始,0分组代表整个 正则表达式
\num 表示引用哪个分组的内容,例如: \1 代表引用1组的内容
扩展:
(?P<name>)
起名字的, 给分组起名字.
(?P=name)
根据名字, 引用分组
示例:
正则表达式_单个字符
# 1.导包
import re
# 需求1:判断字符串是否 包含 it
# 2.正确匹配 , match 是按照字符串,从左往右逐个匹配的,但有一个匹配不上,理解错误
# result = re.match('.*it.*','bb123itcast')
# 需求2:查找字符串汇总 以数字开头 ,后面任意字符 从左往右,逐段查找,任意一段匹配上就行
# 格式:search('正则表达式','要校验的字符串',flags)
# result = re.search('[0-9].*','city:1.beijingh,2.shanghai')
result = re.search('\d.*','city:1.beijingh,2.shanghai')
# 3.判断匹配结果
if result:
# 匹配成功
info = result.group() # 从正则对象中,获取匹配到的内容
print(f'匹配结果是:{info}')
else:
# 匹配成功
print('匹配失败')
# 三目运算符
print(f'匹配结果是:{result.group()}' if result else '匹配失败')
正则表达式_多个字符
# 1.导包
import re
# 2.正确匹配 , match 是按照字符串,从左往右逐个匹配的,但有一个匹配不上,理解错误
# 需求1:演示 * 的用法, 0次或多次
# result = re.match('it.*','itabc1234')
# 需求2:演示 + 的用法 , 1次或多次
# result = re.match('it.+','it1')
# 需求3:演示 ? 的用法 , 1次或 0 次
# result = re.match('it.?','it')
# 需求4:演示 {n} 的用法 , 恰好n次
# result = re.match('ita{3}','itaaa')
# 需求5:演示 {n,} 的用法 , 至少 n 次
# result = re.match('ita{3,}','itaaa')
# 需求6:演示 {n,m} 的用法 , 至少 n 次,至多m次,包括 n和 m
result = re.match('ita{3,5}','itaaa')
# 3.判断匹配结果
if result:
# 匹配成功
info = result.group() # 从正则对象中,获取匹配到的内容
print(f'匹配结果是:{info}')
else:
# 匹配成功
print('匹配失败')
# 三目运算符
print(f'匹配结果是:{result.group()}' if result else '匹配失败')
正则表达式_替换
# 需求3 :演示正则表达式,替换功能
# 1.创建字符串,包含一些要被替换的内容
old_str = "车主说:你的刹车片改换了啊,嘿嘿"
# 2.定义正则表达式规则
p = r'啊|啦|嘿嘿'
# 3.封装正则表达式(字符串),获取:正则对象
res = re.compile(pattern=p) # 根据正则表达式,编译出:正则对象
# 4.具体的替换过程
result_str = res.sub('',old_str)
# 5.打印替换结果
print(f'处理后,内容为{result_str}')
正则表达式_开头和结尾
"""
校验正则表达式开头和结尾
正则规则:
^ 以什么开头
$ 以什么结尾.
"""
# 1.导包
import re
# 2.校验字符串是否以数字开头
result = re.match('^\d+.*','123ABC')
# 校验以数字结尾
#result = re.match('.*\d$','123ABC1')
# 校验数字开头和结尾
#result = re.match('^\d.*\d$','123ABC1')
# 3.判断匹配结果
if result:
# 匹配成功
info = result.group() # 从正则对象中,获取匹配到的内容
print(f'匹配结果是:{info}')
else:
# 匹配成功
print('匹配失败')
# 三目运算符
print(f'匹配结果是:{result.group()}' if result else '匹配失败')
正则表达式_或者
# 1.导包
import re
# 2.校验邮箱
result = re.match('[a-zA-Z0-9_]{4,20}@(163|126|qq)\.(com|cn)','hello123@qq.com')
# 判断并打印
if result:
info = result.group()
print(f'匹配到:{info}')
# 扩展:
print(f'组0:{result.group(0)}') # hello123@qq.com
print(f'组1:{result.group(1)}') # qq
print(f'组2:{result.group(2)}') # com
else:
print('未匹配')
正则表达式_校验标签
"""
# 需求:匹配qq:10567 这样的内容,然后提取qq文字和10567
# 1.导包
import re
# 2,校验标签。num 表示引用哪组正则,在Python中,两个\ 表示\ ,所以不能写\1,而是:\\1
# result = re.match('<[a-ZA-Z1-6](1,4}>.*</[a-zA-Z1-6]{1,4}>','<html>hh</html>')
# result = re.match('<([a-zA-Z1-6]{1,4})>,*</\\1>','<htm>hh</html>')
# result = re.match(r'<([a-zA-Z1-6]{1,4)>,*</\1>','<html>hh</html>') # r'' 取消转义
# 扩展提高(了解): 匹配 html>sh1>hh</h1></html>
# result = re.match(r'<([a-zA-Z1-6]{1,4})><([a-zA-Z1-6]{2})>.*</\2></\1>','<html><h1>hh</h1></html>')
result = re.match(r'<(?P<html>[a-zA-Z1-6]{1,4})><(?P<h>[a-zA-Z1-6]{2})>.*</(?P=h)></(?P=html)>', '<html><h1>hh</h1></html>')
# 3.判断并打印
if result:
info = result.group()
print(f'匹配到:{info}')
# 扩展:
# print(f'组0:{result.group(0)}') # hello123@qq.com
# print(f'组0:{result.group(1)}') # qq
# print(f'组0:{result.group(2)}') # com
else:
print('未匹配')
细节
正则表达式并不是Python所特有的,在Java、PHP、Go以及JavaScript等语言中都是支持正则表达式的。