正则表达式:
是一种用来匹配字符串的强有力的武器。它的设计思想是用一种描述性的语言来给字符串定义一个规则,凡是符合规则的字符串,我们就认为它“匹配”了,否则,该字符串就是不合法的。
1.re模块 - 转义字符和 r前缀
正常情况下我们要打印1111\2222\333" 需要用转义字符写成这样—》str1 ="1111\\2222\\333"
我们用 r前缀 可以增加美观性-》str2 =r"1111\2222\333"
2.常用字符
1.".":匹配除了\n之外的任意一个字符,re.S模式下可以匹配\n
2."\":转义字符
3."[]":或,选择其中包含的字符进行匹配
4."|":或,选择“|”两边的内容进行匹配
5."*":匹配前一个字符出现0或者多个,即可有可无
6."+":匹配前一个字符出现1或者多个,即至少有1次可以有多次
7."?":非贪婪,匹配前一个字符出现1次或者0次,即要么有1次,要么没有
8."\s":空白字符,包含"tab键,空格,\n"
9."\S":匹配非空白
10."\d":匹配数字,即0-9
11."\D":匹配非数字,即不是数字
12."\w":匹配单词字符,即a-z、A-Z、0-9、_、还可以匹配中文
13."\W":匹配非单词字符
14."{m}":匹配前一个字符出现m次
15."{m,n}":匹配前一个字符出现从m到n次
16."^":匹配字符串开头,[^x]匹配除了x以外的任意字符
17."$":匹配字符串结尾
18."(ab)":将括号中字符作为一个分组
19."\num":引用分组num匹配到的字符串
20."(?P<name>)":分组起别名
21."(?P=name)":引用别名为name分组匹配到的字符串
22.(?=...):匹配...出现在之后的位置
23.(?<=...): 匹配...出现在 之前 的位置
3.常用方法
1.re.match(r"匹配条件", "匹配的内容"): 能够匹配出以xxx开头的字符串,默认非贪婪,匹配到符合条件的内容就返回内容,内容为字符串
2.ret.group():引用分组中的内容,有(内容)就按1,2进行引用,如果没有,直接引用当前匹配内容,内容为字符串
3.re.search(r"匹配条件", "匹配的内容"):从全局开始开始匹配,如果匹配到符合条件的内容就返回内容,内容为字符串
4.re.findall(r"匹配条件", "匹配的内容"):从全局开始匹配,默认贪婪,会匹配所有符合条件的内容,再返回一个列表
5.re.sub(r"匹配条件", "需要替换的内容", "匹配的内容"):将匹配到的数据进行替换,返回字符串
6.p = re.compile("匹配条件"):可以将条件保存在一个变量中,再以变量.方法的方式进行匹配
3.() [] {}的区别
()是为了提取匹配字符串的,表达式中有几个(),就有几个相应的匹配字符串。如:(0-9)匹配‘0-9’本身
[] 是定义匹配的字符范围,如:[a-zA-Z0-9]表示相应位置的字符要匹配英文字符和数字。
[^] 非,除了范围内的字符,如[^0-9] 表示匹配除了数字外的字符
{} 一般是用来匹配的长度。
如:0{11}匹配11个0,0{2,}匹配最少2个0,\d{8,11}最少匹配8个数字,最多匹配11个数字
4.代码展示:
1.用正则和不用正则的区别
import re
text = "张三今年30岁,身高:168CM," \
"体重:56kg,身份证号:78978978895548795X," \
"手机号:12345678911,邮箱:zhang_shan@qq.com"\
"博客:https://blog.abcd/zhangshan"\
"公司网址:http://www.zhangshan123.com"
#1.例如我要找到text中是否有张三,不用正则和正则的比较
name = "张三"
if name in text:
print("有这个人")
else:
print("没有找到")
# r 代表原始字符 打印出找到的字符串
# findall 返回找到的例表。
print(re.findall(r'张三',text))
有这个人
['张三']
2.找出所有的数字,非数字,出现1次到多次的数字
#2.找出所有的数字,非数字,出现1次到多次的数字
print("匹配所有的数值:",re.findall(r'\d',text)) #\d 匹配所有的数值
print("匹配所有的数值:",re.findall(r'\D',text)) #\D匹配所有的非数字
print("找出所有的连续数字:",re.findall(r'\d+',text)) #\d+ 匹配所有的数值出现1次到多次的数字,+ 代表重复一次或者多次
匹配所有的数值: ['3', '0', '1', '6', '8', '5', '6', '7', '8', '9', '7', '8', '9', '7', '8', '8', '9', '5', '5', '4', '8', '7', '9', '5', '1', '2', '3', '4', '5', '6', '7', '8', '9', '1', '1', '1', '2', '3']
匹配所有的数值: ['张', '三', '今', '年', '岁', ',', '身', '高', ':', 'C', 'M', ',', '体', '重', ':', 'k', 'g', ',', '身', '份', '证', '号', ':', 'X', ',', '手', '机', '号', ':', ',', '邮', '箱', ':', 'z', 'h', 'a', 'n', 'g', '_', 's', 'h', 'a', 'n', '@', 'q', 'q', '.', 'c', 'o', 'm', '博', '客', ':', 'h', 't', 't', 'p', 's', ':', '/', '/', 'b', 'l', 'o', 'g', '.', 'a', 'b', 'c', 'd', '/', 'z', 'h', 'a', 'n', 'g', 's', 'h', 'a', 'n', '公', '司', '网', '址', ':', 'h', 't', 't', 'p', ':', '/', '/', 'w', 'w', 'w', '.', 'z', 'h', 'a', 'n', 'g', 's', 'h', 'a', 'n', '.', 'c', 'o', 'm']
找出所有的连续数字: ['30', '168', '56', '78978978895548795', '12345678911', '123']
3.找出1开头的手机号
#3.找出1开头的手机号 p = re.compile(r'\b1\d{10}') #re.compile()匹配的条件 1开头的手机号 pip =p.findall(text) print("手机号:",pip)
手机号: ['12345678911']
4.找出18位身份证号
#4.找出18位身份证号 id = re.findall(r'\d{18}|\d{17}X|x$',text) #$匹配字符串结尾 print("身份证号:",id)
身份证号: ['78978978895548795X']
5.找出邮箱
#5.找出邮箱 email = re.findall(r'[a-zA-z0-9_]+@[a-zA-z0-9]+\.[a-zA-z0-9]+',text) #[a-zA-Z0-9_]匹配任何字母及数字和下划线 [a-z]匹配任何小写字母 + 多次 \. 转义字符 \前面写有r‘ 这里可写可不写 为了美观加上去了 print("邮箱:",email)
邮箱: ['zhang_shan@qq.com']
6.找出博客地址
#6.找出博客地址 blog = re.findall(r'[a-z]+://[a-zA-z0-9]+\.[a-z]+/[a-zA-z0-9]+',text) print("博客地址:",blog)
博客地址: ['https://blog.abcd/zhangshan']
7.找出网址
#7.找出网址 purl= re.findall(r'[a-z]+://[a-zA-z]+\.[a-zA-z0-9]+\.[a-z]+.[a-z]+',text) print("网址:",purl)
网址: ['http://www.zhangshan123.com']
8.匹配HTML标签内的内容
#8.匹配HTML标签内的内容 html="<h1>世界那么大我想去看看</h1>" src ="<img src = https://t7.baidu.com/it/u=3631608752,3069876728&fm=193&f=GIF>" phtml = re.findall(r'(?<=<h1>).*(?=</h1>)',html) print("html标签中的内容是:",phtml) #(?<=...): 匹配...出现在 之前 的位置 #(?=...):匹配...出现在 之后 的位置 psrc =re.findall(r'src\s*=\s*[\'\"]?.*[\'\"]?',src) print("src地址:",psrc) #\s*=\s* 匹配 = 前后是否有空格(*为0个以上,包括0) #[\'\"]? 最小匹配,要么有引号要么没有, \转义字符 #.* 匹配所有内容
html标签中的内容是: ['世界那么大我想去看看']
src地址: ['src = https://t7.baidu.com/it/u=3631608752,3069876728&fm=193&f=GIF>']
9.re.sub 替换匹配的数据
#9.re.sub 替换匹配的数据 texts = "GaBc,feaBc,beabc" result = re.sub(r'abc','***',texts,flags=re.I) #re.sub(r"匹配条件", "需要替换的内容", "匹配的内容") ,flags=re.I 指定标志位,re.I忽略大小写 print("替换前的字符串",texts) print("替换后的字符串",result)
替换前的字符串 Gabc,feabc,beabc
替换后的字符串 G***,fe***,be***
正则表达式在线测试工具:正则表达式在线测试 | 菜鸟工具