为了方便爬虫,最近学习了正则表达式,将学习的过程记录如下:
一、正则表达式的概念:
1.使用单个字符串来描述匹配一系列符合某个句子语法规则的字符串
2.是对字符串操作的一种逻辑公式
3.应用来处理文本和数据
4.表达过程:依次拿出表达式和文本中的字符比较,如果每一个字符都能匹配,则匹配成功,否则匹配失败
二、匹配单个字符串
import re
ma = re.match(r'a','a')#匹配a字符
print(ma)
print(ma.group())
mb = re.match(r'a','b')#匹配a字符
print(mb)#匹配不到
m = re.match(r'.','c')#匹配任意字符
print(m)
print(m.group())
mz = re.match(r'[a-z]','F',re.I)#匹配a到z中的任一字符,且忽视大小写
#或者mz = re.match(r'[a-zA-Z0-9]','F',re.I) 可以匹配a-z,A-Z,0-9中的任一字符
print(mz)
print(mz.group())
mbracket = re.match(r'[w]','[a]')#由于[...]已经被定义为匹配字符集了,所以用该方法匹配中括号里面的a不行
print(mbracket)#
mbracket1 = re.match(r'[[w]]','[a]')#匹配中括号里面的a需要用该种方法
print(mbracket1)#
print(mbracket1.group())
二、匹配多个字符串
import re
ma = re.match(r'[A-Z][a-z]','Bc')
print(ma)
print(ma.group())
mb = re.match(r'[A-Z][a-z]','B')#匹配出来为None ,不能匹配单个字符了
print(mb)
mz = re.match(r'[A-Z][a-z]*','Bcdascxzdsa')# *号匹配前一字符0次或无限次
print(mz)
print(mz.group())
m99 = re.match(r'[1-9]?[0-9]','78')#匹配0-99的任一数字
m9 = re.match(r'[1-9]?[0-9]','7')#?表示出现0次或者1次
print(m9)
print(m99)
print(m99.group())
m6 = re.match(r'[0-9a-zA-Z]{6}','dsaf21')#匹配单词字符6次
m6 = re.match(r'[w]{6}','dsaf21')#或者使用w
print(m6)
mail = re.match(r'[w]{6,10}@163.com','abc1234@163.com')#匹配含有6-10个字符的163邮箱
print(mail)
print(mail.group())
四、匹配字符串开头或者结尾
import re
mail = re.match(r'[w]{6,10}@163.com','abc1234@163.com1234')
print(mail.string) #这样也是可以匹配到的
ma1 = re.match(r'^[w]{4,10}@(163|126).com$','abc1@126.com123')#S表示必须以@163|126.com结尾
print(ma1) #这样就没法匹配到字符串了
ma2 = re.match(r'^[w]{4,10}@(163|126).com$','abc1@122.com')
print(ma2)#122.com也不能匹配到
ma3 = re.match(r'Aimooc[w]*','imoocpython')# A表示必须以 imooc 开头
print(ma3.string)
ma4 = re.match(r'Aimooc[w]*','iimoocpython')
print(ma4)# iimooc就没法匹配到
五、常用函数search、findall、sub、split
1.#search查找字符串中匹配到的第一次出现的位置
import re
str1 = 'imooc videonum = 1000'
print(str1.find('1000')) #find只能查找指定字符串,如果字符串改变就不能查找
info = re.search(r'd+',str1)#d表示查找数字
print(info.group())
2.#find 查找所有匹配,并把匹配的值返回到列表中
str2 = 'c++=100,java=90,python=80'
info_search = re.search(r'd+',str2)
info_findall = re.findall(r'd+',str2)
print(info_search.group(),' ',info_findall)#search只能匹配到一个值,而findall返回一个包含所有值的列表
print(sum(int(x) for x in info_findall))#使用列表解析进行求和
3.#sub用于替换字符串 sub(pattern,repl,string,count=0,flags=0)
①#当repl为字符串时
str1 = 'imooc videonum = 1000'
str2 = 'c++=100,java=90,python=80'
info1 = re.sub(r'd+','1001',str1)
info2 = re.sub(r'd+','1001',str2)
print(info1,' ',info2)
②#当repl为函数时
def add1(pipei):#定义函数
val = pipei.group()# pipei是pattern从string中匹配到的值,需要使用group来调用这个match
num = int(val)+1
return str(num)#需要返回一个str,int型不能传回字符串
info_add1 = re.sub(r'd+',add1,str1)
print(info_add1)
info_add2 = re.sub(r'd+',add1,str2)# sub实现的是findall的功能,能对所有匹配到的字符进行处理
print(info_add2)
4.split根据匹配到的字符串来分割字符,返回分割字符串组成的列表
split(pattern,string,maxsplit=0,flag=0)
import re
str4 = 'imooc:C C++ Java Python'
info_split1 = re.split(r':| ',str4)#将字符串str4 按:或者空格 进行分割
print(info_split1)
str5 = 'imooc:C C++ Java Python,C#'
info_split2 = re.split(r':| |,',str5)
print(info_split2)#按照冒号: 空格 或者逗号,进行分割成列表