1)使用元字符进行排列组合来匹配字符串。
2)每一个元字符默认只匹配一个字符串。
元字符是具有固定含义的特殊符号,如下所示。
. 匹配除换行符以外的其他字符
\w 匹配字母或数字或下划线
\s 匹配任意的空白符
\d 匹配数字
\n 匹配一个换行符
\t 匹配一个制表符
^ 匹配字符串的开始
$ 匹配字符串的结尾
\W 匹配\w范围之外的所有字符
\S 匹配\s范围之外的所有字符
\D 匹配\d范围之外的所有字符
a|b 匹配字符a或字符b
() 匹配括号内部的表达式(一个整体)
[] 匹配括号内部的所有字符(每一个)
[^] 匹配除了括号内部字符的其他所有字符
下面6个是量词,用来控制前面元字符的次数
* 重复0次或更多次
+ 重复1次或更多次
? 重复0次或1次
{n} 重复n次
{n,} 重复n次或更多次
{n,m} 重复n次到m次
.* 贪婪匹配
.*? 惰性匹配
贪婪匹配是,如果满足条件,会尽可能多的匹配内容。
惰性匹配是,如果满足条件,会尽可能少的匹配内容。(回溯机制)
作用:匹配字符串中所有符合正则的内容
缺点:返回的是列表,效率不高
import re
# 强迫症看到\d下面的波浪线很难受,在前面加一个r即可
lst = re.findall(r"\d+","我的一个手机号是:10086,另一个手机号是10010")
# findall()返回的数据类型是列表
print(lst)
作用:匹配字符串中所有符合正则的内容
优点:返回的是迭代器,效率更高
import re
it = re.finditer(r"\d+","我的手机号是:10086,另一个手机号是10010")
# 返回的数据类型是迭代器(看不到数据)
print(it)
# 从迭代器中拿到数据
for i in it:
print(i.group())
特点:找到一个结果就返回值,类似于惰性匹配
import re
se = re.search(r"\d+","我的手机号是:10086,另一个手机号是10010")
# 返回的数据类型是match对象
print(se.group())
特点:预加载正则表达式,可以在后面反复调用
import re
obj = re.compile(r"\d+")
# 第一次调用
ret1 = obj.finditer("我的手机号是:10086,另一个手机号是10010")
for i in ret1:
print(i.group())
# 第二次调用
ret2 = obj.findall("我的200块钱该还我了吧")
print(ret2)
特点:单独从正则匹配的内容中进一步提取内容
import re
str = """
"""
# re.S的作用是,让.可以匹配换行符
obj = re.compile(r".*?)&type=(?P\d+)> ",re.S)
result = obj.finditer(str)
for i in result:
print(i.group("mov_typ"))
print(i.group("id"))
得到某瓣电影排名前25名的电影名
首先,需要拿到页面的源代码。(导入requests模块)
其次,利用正则提取想要的数据信息。(导入re模块)
最后,重点是分析如何提取电影名(ctrl+U打开网页源代码)。
这里笔者从开始,直到
肖申克的救赎
那一栏,中间的内容全部用.*?
惰性匹配符号。如果使用贪婪匹配符合,那么前24个电影名字都会被跳过,最终只会显示第25个电影的名字。
接着照抄电影名前面的内容,将电影名这一堆字符串通过compile()
进一步提取出来,后面继续照抄。
最后记得关闭访问请求。
同理,我们也可以按照这样的办法得到其他信息,比如电影上映的年份、电影评分的人数、电影的最终评分等信息,注意正确使用正则即可。
import requests
import re
url = "https://movie.douban.com/top250"
# 伪装成正常的浏览器用户访问
headers = {
"User-Agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Mobile Safari/537.36"
}
# 请求访问并得到响应
response = requests.get(url=url,headers=headers)
# 得到网页源代码
code = response.text
# 解析数据
obj = re.compile(r'- .*?(?P
.*?) ' , re.S)
# 开始正则匹配
result = obj.finditer(code)
# 得到电影名字
for i in result:
print(i.group("name"))
# 访问结束,关闭请求
response.close()
想要得到电影的名字、电影上映时间、电影评分、参与评分电影的人数这四个数据信息,并且将这些数据以CSV格式输出,代码如下。
import requests
import re
import csv
url = "https://movie.douban.com/top250"
# 伪装成正常的浏览器用户访问
headers = {
"User-Agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Mobile Safari/537.36"
}
# 请求访问并得到响应
response = requests.get(url=url,headers=headers)
# 得到网页源代码
code = response.text
# 解析数据
obj = re.compile(r'- .*?(?P
.*?) .*?
(?P.*?) .*?age">(?P.*?) .*?(?P.*?)人评价 ', re.S)
# 开始正则匹配
result = obj.finditer(code)
# 打开文件,开始向文件中写入数据
f = open("movie.csv",mode="w")
csv_write = csv.writer(f)
for i in result:
# 将得到的所有数据整理成字典的形式
dic = i.groupdict()
# 处理数据year前面的空格
dic['year'] = dic['year'].strip()
# 将字典里的数据写出去
csv_write.writerow(dic.values())
# 处理完成
print("over!!!!")
# 关闭页面
f.close()
# 访问结束,关闭请求
response.close()