正则表达式、re模块以及《斗破苍穹》案例学习

#声明 我只是练习案例的搬运工

一、正则表达式

1.FlagsFlags 写在结束的/之后,可以影响整个正则表达式的匹配行为。

g:全局匹配(global);正则表达式默认只会返回第一个匹配结果,使用标志符g则可以返回所有匹配

i:忽略大小写(case-insensitive);在匹配时忽略英文字母的大小写

m:多行匹配(multiline);将开始和结束字符(^$)视为在多行上工作,即分别匹配每一行(由 \n \r 分割)的开始和结束,而不只是只匹配整个输入字符串的最开始和最末尾处

  1. 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()方法可以让程序暂停。

  1. 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()  # 关闭文档

猜你喜欢

转载自www.cnblogs.com/yang16/p/13396370.html