(1)正则表达式的基本符号。
(2)如何在Python中使用正则表达式。
(3)正则表达式的提取技巧。
(4)Python读写文本文件和CSV文件。
1、正则表达式
在一万个人里面找一个人很困难,但是在一万个人里面找一个非常“有特点”的人却很容易。假设有一个人,皮肤是绿色的,身高三米,那么即使这个人混在一万人中,其他人也能一眼找到他。这个“寻找”的过程,在正则表达式中叫作“匹配”。
使用正则表达式有如下步骤。(1)寻找规律。(2)使用正则符号表示规律。(3)提取信息。
1、基本符号
点号 "." 除换行符外任意一个字符
星号 "*" 前面一个子表达式0次到无限次 一串字符串".*"
问号 "?" 前面的子表达式0次或无数次 组合".*?"
反斜杠 "\" 转义字符
数字 "\d" 表示一位数字digital 表示多位用"\d*"
小括号"()" 从一段字符串中“提取”出一部分的内容
2、在Python中使用正则表达式
模板导入 import re
1.findall
以列表的形式返回所有满足要求的字符串。
函数原型:re.findall(pattern, string, flags=0)
pattern表示正则表达式,string表示原来的字符串,flags表示一些特殊功能的标志。
2.search
只会返回第1个满足要求的字符串。一旦找到符合要求的内容,它就会停止查找。
原型:re.search(pattren, string, flags=0)
3. ".*" 和 ".*?" 的区别
.*?这3个符号大多数情况下一起使用。
“.*”:贪婪模式,获取最长的满足条件的字符串。
“.*? ”:非贪婪模式,获取最短的能满足条件的字符串。
3、正则表达式提取技巧
1.不需要compile 使用findall()时调用了compile()
2.先抓大再抓小 把有效的整体提取出来再匹配
3.示例 result_1 = re.findall('姓名:(.*?)\n', string_1)
2、读写文本文件和CSV
with open('文件路径' , ' 文件操作方式' , encoding=' utf-8') as f:
对文件操作
f.readlines() 读取文本所有行并以列表形式返回
f.read() 直接把文件里面的内容用一个字符串返回
f.write("一大段文字") 直接将一大段字符串写入到文本中
3、案例——半自动化爬虫开发
在百度贴吧中任意寻找一个贴吧并打开一个热门帖子,将帖子的源代码复制下来,并保存为source.txt。Python读入这个source.txt文件,通过正则表达式获取用户名、发帖内容和发帖时间,并保存为result.csv
(1)在浏览器中查看网站的源代码。(2)使用Python读文本文件。(3)正则表达式的应用。(4)先抓大再抓小的匹配技巧。(5)使用Python写CSV文件。
import re
import csv
with open('流金岁月.txt', encoding='utf-8') as f:
source = f.read()
result_list = []
username_list = re.findall('username="(.*?)"', source, re.S)
content_list = re.findall('clearfix" style="display:;">(.*?)</div><br>', source, re.S)
reply_time_list = re.findall('date":"(.*?)"', source, re.S)
print(username_list)
print(content_list)
for i in range(len(username_list)):
result = {'username': username_list[i],
'content': content_list[i],
'reply_time': reply_time_list[i]}
result_list.append(result)
with open('tieba.csv', 'w', encoding='UTF-8') as f:
writer = csv.DictWriter(f, fieldnames=['username', 'content', 'reply_time'])
writer.writeheader()
writer.writerows(result_list)