官方文档
https://docs.python.org/zh-cn/3/library/re.html
简介
正则表达式,就是使用
普通字符(大小写字母、数字···
)、
转义字符(\w \W \D \d
)、
特殊字符(. * ? + ^ $ [] {} ()
)
组成一个规则,用这个规则对文本的类容完成一个搜索或匹配或替换的功能。
基本语法
import re
# 定义字符串
a='doitbyyourself666'
# 定义正则表达式
reg='yourself'
# 调用正则函数方法
res=re.findall(reg,a)[0]
print(res)
re模块相关函数
re.match()
从头匹配
要么第一个符合要求,要么不符合
匹配成功则返回match对象,否则返回None
可以使用group()方法获取对象 print(res.group())
可以使用span()方法获取匹配的数据的下标区间
第一个print函数会打印none,因为match函数只能从头开始匹配,不能从中间开始。而当返回值为none时,再次调用group()方法就会出现AttributeError: 'NoneType' object has no attribute 'span'这类报错。
修改后
re.search()
从字符串开头到结尾进行搜索式匹配
若整个字符串都没有匹配到,则失败,返回None
re.findall()
按照正则表达式的规则在字符串中匹配所有符合规则的元素,结果返回一个列表,若没,则返回空列表
tip:
转移符号 | 意义 |
---|---|
\D | 单个非数字 |
\d | 单个数字 |
\w | 单个数字、字母、下划线 |
\W | 单个非 数字、字母、下划线 |
\s | 单个空格符或制表符 |
\S | 单个非 空格符或制表符 |
re.finditer()
按照正则表达式的规则在字符串中匹配所有符合规则的元素,返回一个迭代器
re.sub()
按照正则表达式的规则,在字符串中找到需要被替换的字符串,来完成一个替换
参数:
pattern:正则表达式的规则,匹配需要被替换的字符串
repl: 替换后的字符串
string: 被替换的原始字符串
re.compile()
可以直接将正则表达式定义为 正则对象,使用正则对象直接操作
(通俗:方便遍历操作)
tip:
reg = '.'
. 点代表单个的 任意字符 除了换行符之外
reg = '\w*'
有*,那么一直从开始一直匹配,直到不符合匹配规则结束返回
reg = '\w+'
有+,匹配次数至少一次,若开始不符合,则继续向后再匹配一次,后面和*一样
reg = 'w+?'
?,拒绝贪婪,区别:完成前面的匹配规则就返回
实战
import json
import requests, re
url = 'https://old.lmonkey.com/ask'
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36 Edg/92.0.902.67'}
res = requests.get(url, headers)
if res.status_code == 200:
# 获取返回数据
res.html = res.text
reg = '<div class="topic_title mb-0 lh-180 ml-n2">(.*?)<small'
titlelist = re.findall(reg, res.html)
# 定义解析作者的正则
reg = '<strong>(.*?)</strong>'
authorlist = re.findall(reg, res.html)
#print(authorlist)
# 定义解析时间的正则
reg = '<span data-toggle="tooltip" data-placement="top" title="(.*?)">'
datelist = re.findall(reg, res.html)
# 定义解析url的正则
reg = ' <a href="(.*?)" target="_blank">'
urllist = re.findall(reg, res.html)
# 压缩数据
data = list(zip(titlelist, authorlist, datelist, urllist))
print(data)
datalist = [{'title': i[0], 'url':i[1], 'author':i[2], 'data':[3]} for i in data]
#数据入库
with open('./redata.json', 'w' , encoding='utf-8') as fp:
json.dump(datalist, fp)
redata.json经过格式后如图所示
工具:https://www.sojson.com/