#声明 我只是练习案例的搬运工
一、正则表达式
1.Flags:Flags 写在结束的/之后,可以影响整个正则表达式的匹配行为。
g:全局匹配(global);正则表达式默认只会返回第一个匹配结果,使用标志符g则可以返回所有匹配
i:忽略大小写(case-insensitive);在匹配时忽略英文字母的大小写
m:多行匹配(multiline);将开始和结束字符(^和$)视为在多行上工作,即分别匹配每一行(由 \n 或 \r 分割)的开始和结束,而不只是只匹配整个输入字符串的最开始和最末尾处
- Character Sets:用于匹配字符集合中的任意一个字符
[xyz]:匹配 "x"或"y"``"z"
[^xyz]:补集,匹配除 "x" "y" "z"的其他字符
[a-z]:匹配从 "a" 到 "z" 的任意字符
[^a-n]:补集,匹配除 "a" 到 "n" 的其他字符
[A-Z]:匹配从 "A" 到 "Z" 的任意字符
[0-9]:匹配从 "0" 到 "9" 的任意数字
比如匹配所有的字母和数字可以写成:/[a-zA-Z0-9]/ 或者 /[a-z0-9]/i。
3.Quantifiers :在实际使用中常需要匹配同一类型的字符多次
{n}:匹配 n 次
{n,m}:匹配 n-m 次
{n,}:匹配 >=n 次
?:匹配 0 || 1 次
*:匹配 >=0 次,等价于 {0,}
+:匹配 >=1 次,等价于 {1,}
4.Metacharacters:在正则表达式中有一些具有特殊含义的字母,被称为元字符,简言之,元字符就是描述字符的字符,它用于对字符表达式的内容、转换及各种操作信息进行描述
\d:匹配任意数字,等价于 [0-9]
\D:匹配任意非数字字符;\d 的补集
\w:匹配任意基本拉丁字母表中的字母和数字,以及下划线;等价于 [A-Za-z0-9_]
\W:匹配任意非基本拉丁字母表中的字母和数字,以及下划线;\w 的补集
\s:匹配一个空白符,包括空格、制表符、换页符、换行符和其他 Unicode 空格
\S:匹配一个非空白符;\s的补集
\b:匹配一个零宽单词边界,如一个字母与一个空格之间;例如,/\bno/ 匹配 "at noon" 中的 "no",/ly\b/ 匹配 "possibly yesterday." 中的 "ly"
\B:匹配一个零宽非单词边界,如两个字母之间或两个空格之间;例如,/\Bon/ 匹配 "at noon" 中的 "on",/ye\B/ 匹配 "possibly yesterday."中的 "ye"
\t:匹配一个水平制表符(tab)
\n:匹配一个换行符(newline)
\r:匹配一个回车符(carriage return)
二、re模块学习
1.search()函数:匹配并提取第一个符合规律的内容,返回一个正则表达式对象。
语法:re.math(pattern,string,flags=0)
1)pattern为匹配的正则表达式。
2)string为要匹配的字符串。
3)flags为标志位,用于控制正则表达式的匹配方式,如是否区分大小写,多行匹配等
import re
a='one1two2three3'
infos=re.search('\d+',a)
print(infos.group()) #group方法获取信息 结果1
2.sub函数:sub()函数用于替换字符串中的匹配项
语法:re.sub(pattern,repl,string,counts=0,flags=0)
1)pattern为匹配的正则表达式。
2)repl为替换的字符串。
3)string为要被查找替换的原始字符串。
4)counts为模式匹配后替换的最大次数,默认0表示替换所有的匹配。
5)flags为标志位,用于控制正则表达式的匹配方式,如是否区分大小写,多行匹配等。
phone= '123-4567-1234'
new_phone = re.sub('\D','',phone)
print(new_phone) #12345671234
3.findall()函数:匹配所有符合规律的内容,并以列表的形式返回结果
import re
a='one1two2three3'
infos=re.findall('\d+',a)
print(infos) #['1', '2', '3']
4.re模块修饰符
a=’’’<div>指数
</div>’’’
word = re.findall(‘<div(.*?)</div>’,a,re.S)
print(word)
三、案例《斗破苍穹》
分析:
1.Requests库用于请求网页获取网页数据。使用Python中的re模块匹配正则表达式获取文本信息。time库的sleep()方法可以让程序暂停。
- User-Agent,用于伪装为浏览器,便于爬虫的稳定性。
3.新建TXT文档,用于存储小说的全文信息
4.定义get_info()函数,用于获取网页信息并存储信息。传入URL后,进行请求。通过正则表达式定位到小说的文本内容,并写入TXT文档中。
5.程序的主入口,使用列表的推导式构造所有小说URL,并依次调用get_info()函数
代码:
import requests
import re
import time
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36'}
# 加入请求头,增加爬虫稳定性
f = open('D:\pytext\doupo.txt', 'a+') # 新建txt文档,以追加方式打开
def get_info(url): # 每一页面的文本爬取函数
res = requests.get(url, headers=headers)
if res.status_code == 200: # 判断请求码是否为200,若是,则成功,不是,则失败
contents = re.findall('<p>(.*?)</p>', res.content.decode('UTF-8'), re.S) # 定义编码方式
for content in contents:
f.write(content + '\n') # 正则获取数据写入txt文件
else:
pass
if __name__ == '__main__':
urls = ['http://www.doupoxs.com/doupocangqiong/{}.html'.format(str(i)) for i in range(2, 1665)] # 总爬取页数
for url in urls:
get_info(url)
time.sleep(1)
f.close() # 关闭文档