正则表达式的学习:
https://www.bilibili.com/video/av19956343?p=128
#re模块简介
re.match函数
原型:match(pattern,string,flags=0)
参数:
标志位flags值如下:
re.I 忽略大小写,影响 ^和$
re.L 做本地用户识别
re.M 多行匹配
re.S 匹配包括换行符在内的所有字符
re.U 根据Unicode字符集解析字符,影响\w \W \b \B
re.X 以更灵活的格式理解正则表达式
功能:尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功返回None
re.search函数
原型:match(pattern,string,flags=0)
功能:扫描整个字符串,并返回第一个成功的匹配
re.findall函数
原型:match(pattern,string,flags=0)
功能:扫描整个字符串,并返回结果列表
https://www.bilibili.com/video/av19956343?p=129
#正则表达式的元字符
[]是字符集合,表示匹配方括号中所包含的任意一个字符
[a-z]匹配任意小写字母
[0-9a-zA-Z_]匹配任意的数字、字母和下划线
[^sun]匹配除了sun之外的所有字符
\d匹配数字,效果同[0-9]
\D匹配非数字字符,效果同[^0-9]
\w同[0-9a-zA-Z_]
\W同[^0-9a-zA-Z_]
[ \f\n\r\t]
\S匹配任意非空白符,同[^ \f\n\r\t]
#边界字符
^行首匹配
$行尾匹配
\A匹配字符串开始,只匹配整个字符串的开头
\Z只匹配整个字符串的结束
\b匹配一个单词的边界,也就是指单词和空格间的位置
\B匹配非单词边界
https://www.bilibili.com/video/av19956343?p=131
(xyz)匹配小括号内的xyz,作为一个整体去匹配
x?匹配0个或1个x
x*匹配0个或任意多个x
x+匹配至少一个x
x{n}匹配确定的n个x(n是一个非负整数)
x{n,}匹配至少n个x
x{n,m}匹配至少n个最多m个x
x|y或
#特殊*? +? x? 最小匹配
匹配/* part */
模式r“//*.*/*/“
(?:x)类似xyz但不表示一个组
https://www.bilibili.com/video/av19956343?p=133
#字符串切割
str=”as asd asd”
re.split(r” +”,str)
re.finditer函数
功能:与findall类似,返回的是一个迭代器
字符串的替换和修改
re.sub(pattern,rep1,string,count=0,flags=0)
re.subn(pattern,rep1,string,count=0,flags=0)
rep1 指定用来替换的字符
string 目标字符串
count 最多替换次数
区别:前者返回一个被替换的字符串,后者返回一个元组,第二个是次数
https://www.bilibili.com/video/av19956343?p=134
#提取子组
()
group(0)一直代表原始字符串
编译:当我们使用re时,模块会做两件事
- 编译re,如果不合法会报错
- 用编译后的re去匹配对象
compile(pattern,flags=0)
https://www.bilibili.com/video/av19956343?p=135
并完成了简单的爬虫,还不能动态爬取:
import urllib.request import random import json import re #取消证书验证 import ssl ssl._create_default_https_context = ssl._create_unverified_context url="http://www.beijing.gov.cn/hudong/hdjl/com.web.search.replyMailList.flow" #模拟请求头 agentList=[ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0" "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; SE 2.X MetaSr 1.0; SE 2.X MetaSr 1.0; .NET CLR 2.0.50727; SE 2.X MetaSr 1.0)" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; 360SE)" ] agentStr= random.choice(agentList) req = urllib.request.Request(url) req.add_header('User-Agent',agentStr) response = urllib.request.urlopen(req) pattern = re.compile('(.*?) ', re.S) results = pattern.findall(response.read().decode('utf-8')) for result in results: print(result)