正则表达式
正则表达式是对字符串操作的一种逻辑公式. 我们一般使用正则表达式对字符串进⾏行匹
配和过滤.
1. 字符组
字符组很简单⽤用[]括起来. 在[ ]中出现的内容会被匹配, 例如:[abc] 匹配a或b或c
[a-z] 匹配a到z之间的所有字母 [0-9]匹配所有阿拉伯数字,能够样子的写的都是按照ASCII上的编码的顺序写的
元字符:常用的元字符
. 匹配除换行符以外的任意字符
\n 匹配一个换行符
\t 匹配一个制表符
\s 匹配任意的空白符
\S 匹配非空白符
\w 匹配字母或数字或下划线
\W 匹配非字母或数字或下划线
\d 匹配数字
\D 匹配非数字
\b 匹配一个单词的结尾或开头
a|b 匹配字符a或字符b
( ) 匹配括号内的表达式,也表示一个组
使用量词是可以一次匹配到多个字符
* 重复零次或更多次{0,n}
+ 重复一次或更多次{1,n}
? 重复零次或一次{0,1}
{n} 重复n次
{n,} 重复n次或更多次
{n,m} 重复n到m次
在量词中的*, +,{} 都属于贪婪匹配. 就是尽可能多的匹配到结果.
例如:我是第一个A,然后我是第二个A
使用贪婪匹配的话是 .*A >>>直接获取的从开头到第二个A的位置
.+也是贪婪匹配
惰性匹配如 .*?A >>>>>获取的是从开头到第一个A的位置
分组
匹配15位身份证或18位身份号码eg:
^[1-9]\d{13,16}[0-9x]$
^[1-9]\d{14}(\d{2}[0-9x])?$
^([1-9]\d{16}[0-9x]|[1-9]\d{14})$
Python的RE 模块
search、match、findall、finditer
import reres = re.search('e','alex and excengpter')#查找关键字,搜索到第一个的时候就返回,没有返回None# print(type(res))## print(res.group()) #eres1 = re.match('al','alex')#必须是从头开始匹配,搜索到第一个的时候就返回,没有返回None# print(type(res1))# # print(res1.group())#alres2 = re.findall('哈把','我的天啊,哈哈啊哈啊哈哈哈') #查找所有的匹配的结果并以列表的形式返回,如果没有就返回空列表res3 = re.findall('哈+','我的天啊,哈哈啊哈啊哈哈哈')# print(res2)#[]# print(res3)#['哈哈', '哈', '哈哈哈']res4 = re.finditer('哈','我的天啊,哈哈啊哈啊哈哈哈') #与findall 一样,不同的是这个返回的是迭代器#注意但是这个在迭代出来的时候还是需要使用group()才能显示里面的元素# print(type(res4))#如果finditer 没有查找到内容的话,返回的是一个空的迭代器for i in res4: print(i.group()) #还是需要使用group 才能显示里面的内容
split的使用
import re# 案例1 res5 = re.split('[ab]','ni shi yi ge sba sb ba') #按照a或b 进行切割print(type(res5))#print(res5)#['ni shi yi ge s', '', ' s', ' ', '', '']res6 = re.split('([ab])','ni shi yi ge sba,sb,ba') #按照a或b 进行切割,并保留a,bprint(type(res6))# print(res6)#['ni shi yi ge s', 'b', '', 'a', ',s', 'b', ',', 'b', '', 'a', '']# 案例2gg = re.split(r'\d+','我2是3笨4蛋')print(gg)hh = re.split(r'(\d+)','我2是3笨4蛋')print(hh)
compile 的使用
import re# 案例1aa = re.compile(r'fa\d+of')#从正则表达式匹配的内容每个组起名字,定义一个正则表达式的模板,并进行预加载cc = aa.search('hahd fajofa11111ofa')print(type(cc))#print(cc.group())#fa11111of# 案例2bb = re.compile(r'fa(?P \d+)of') # (?P )将括号内匹配到的东西进行命名,方便以后直接通过名字进行提取括号的内容cc = bb.search('hahd fajofa11111ofa')print(cc.group())#fa11111ofprint(cc.group('gg'))#11111
使用正则进行替换sub、subn
import regg = re.sub(r'\d+','*将前面表达式匹配到的替换成我*','123我是有多么的爱你是笨蛋23333')#返回的是字符窜print(gg)dd = re.subn(r'\d+','*将前面表达式匹配到的替换成我*','123我是有多么的爱你是笨蛋23333')#与上面的功能是一样的,# 但是返回的是元组,(第一个是替换后的字符串,第二个是替换的个数)
使用re 的制作的简单的爬虫
from urllib.request import urlopen import re url = 'https://www.dytt8.net/html/gndy/dyzz/20181116/57793.html' gg = urlopen(url).read().decode('gbk') # print(gg) dd = re.compile(r'.*?译 名(?P.*?) .*?片 ' r' 名(?P .*?) .*?年 代(?P
注意的是:
ret = re.findall('www.(baidu|guge).com', 'www.baidu.com')
print(ret) # ['baidu] 这是因为findall会优先把匹配结果组里内容返回,如果想要匹
配结果,取消权限即可
ret = re.findall('www.(?:baidu| guge).com', ' 'www.baidu.com'')
print(ret) # [' 'www.baidu.com'']