1 - re.match
-
简介
re.match(匹配的规则表达式,源字符串,标志位) re.match从字符串的始位置匹配,若始位置匹配成功的话则返回匹配对象,否则返回None
-
知识点
re.I忽略大小写 span()获取匹配值的位置,默认num=0,可输入指定组号获取相应的下标值 [元组] group()默认num=0,可输入指定组号获取相应的匹配值 [字符串] group() 组号num为0则获取从始位置到终位置的匹配值 [字符串] groups()从组号1开始,获取所有组号的值 [元组] 例如:('A', 'le and Orange')
-
代码
import re # 源字符串1 source_text1 = "Apple and Orange" #若有匹配值则返回Match对象,否则返回None mat = re.match("(.*)PP(.*)",source_text1,re.I) print(mat.span(1)) print(mat.group(1)) print(mat.groups())
-
打印
(0, 1) A ('A', 'le and Orange')
2 - re.search
-
简介
re.search(匹配的规则表达式,源字符串,标志位) re.search搜寻整个字符串并返回第一个成功的匹配。则返回匹配对象,否则返回None
-
知识点
re.I忽略大小写 span()获取匹配值的位置,默认num=0,可输入指定组号获取相应的下标值 [元组] group()默认num=0,可输入指定组号获取相应的匹配值 [字符串] group() 组号num为0则获取从始位置到终位置的匹配值 [字符串] groups()从组号1开始,获取所有组号的值 [元组] 例如:('A', 'le and Orange') re.search和re.match的区别在于,前者是匹配字符串全部位置,后者是匹配开头字符串位置 (若还是不了解可看下面扩展)
-
代码
import re # 源字符串1 source_text1 = "Apple and Orange" #若有匹配值则返回Match对象,否则返回None mat = re.search("(.*)PP(.*)",source_text1,re.I) print(mat.span(1)) print(mat.group(1)) print(mat.groups())
-
打印
(0, 1) A ('A', 'le and Orange')
-
扩展
#!match和search区别 import re # 源字符串1 source_text1 = "Apple and Orange" #match只会在开头位置匹配,search可在任何位置匹配 #若有匹配值则返回Match对象,否则返回None mat1 = re.match("le",source_text1,re.I) mat2 = re.search("le",source_text1,re.I) print(mat1) #打印:None print(mat2) #打印:<re.Match object; span=(3, 5), match='le'> #match只会在开头位置匹配,search可在任何位置匹配 #若有匹配值则返回Match对象,否则返回None mat3 = re.match("App",source_text1,re.I) mat4 = re.search("App",source_text1,re.I) print(mat3) #打印:<re.Match object; span=(0, 3), match='App'> print(mat4) #打印:<re.Match object; span=(0, 3), match='App'>
3 - re.findall
-
简介
re.findall(匹配的规则表达式,源字符串,标志位) re.findall搜寻整个字符串并返回所有成功的匹配的值。则返回迭代器,否则返回None
-
知识点
re.I忽略大小写 re.search和re.findall的区别在于,前者是匹配字符串全部位置一次,后者是匹配字符串全部位置多次 (若还是不了解可看下面扩展)
-
代码
import re # 源字符串1 source_text1 = "Apple and Orange and Pear" #findall匹配字符串全部位置多次,返回一个迭代器,否则返回None mat = re.findall("and",source_text1) print(mat)
-
打印
['and', 'and']
-
扩展
#!match和search区别 import re # 源字符串1 source_text1 = "Apple and Orange and Pear" #匹配字符串全部位置一次 mat1 = re.search("and",source_text1) print(mat1.group()) #打印:and #匹配字符串全部位置多次 mat2 = re.findall("and",source_text1) print(mat2) #打印:['and', 'and']
4 - 正则应用
-
4-1 网络爬虫 (re.findall)
import re import requests #目标网址 url = "https://movie.douban.com/subject/34973399/comments?status=P" #请求头构造 headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'} #基础爬取(适用于无反爬机制的网站) response = requests.get(url,headers = headers) #获取爬取后的网页源代码(后期用于清洗数据) html_source = response.text #打印网页源代码 print(html_source) # .除了换行符,匹配任意字符 #re.I 忽略大小写 #re.S .匹配任意字符可包含换行符 # ?非贪婪模式 # *匹配0个或多个的表达式。 # []从该括号内任意匹配一个表达式 #获取标题 movie_title = re.findall("[<v>]title>(.*)</title>",html_source,re.S)[0].strip() #获取所有评论 movie_comment = re.findall('<span class="short">(.*?)</span>',html_source,re.S)
-
4-2 注册账号验证 (re.match)
import re class User: @classmethod def register(self,email,username,passwd): # .代表任意字符(除换行符) # *表示匹配0个或多个表达式 # [qq,163]意思从'q'或者'q'或者','或者'1'或者'6'或者'3'中匹配1个字符 # {1,3}表示匹配1个字符到3个字符 # \d 表示任意数字 # {6,}表示匹配至少6个字符 # [a-z]表示a到z的所有字母 email = email if re.match(".*@[qq,163]{1,3}.com",email) else None username = username if re.match("\d{6,}",username) else None passwd = passwd if re.match("[a-z]{1}.*",passwd) else None if not email: print("邮件格式不正确") if not username: print("账号格式不正确,不能小于6位") if not passwd: print("密码格式不正确,必须以字母开头") if __name__ == "__main__": User.register("871937893@163.com","131232","a123123123123")