一、知识回顾
正则模块
正则表达式
元字符 :
. 匹配除了回车以外的所有字符
\w 数字字母下划线
\d 数字
\n \s \t 回车 空格 和 tab
^ 必须出现在一个正则表达式的最开始,匹配开头
$ 必须出现在一个正则表达式的最后,匹配结尾
| 或
a|b 要么取左边的要么取右边的
()|() 分组中的或 一定是长的在前面 短的在后面
[] 在同一个位置上可能出现的所有字符都放在组里
[^] 在同一个位置上不能出现的所有字符都放在组里
() 对于一整个组做量词约束 ; python 分组优先
量词 :
* 0次或多次
+ 1次或多次
? 0次或1次
{} 具体的 {n},{n,m},{n,}
问号的用法
惰性匹配 : 量词+? 表示使用惰性匹配
分组优先 findall split ;取消分组优先 (?:。。。)
分组命名 (?P<name>...)
匹配整数
import re ret=re.findall(r"\d+","1-2*(60+(-40.35/5)-(-4*3))") print(ret)
执行输出:
['1', '2', '60', '40', '35', '5', '4', '3']
结果是不对的,因为它把小数也拆分了,得到['40','35']
有的时候 不想要的内容需要被匹配出来
你不想要的东西包含着你想要的东西
匹配小数
import re ret=re.findall(r"-?\d+\.\d*","1-2*(60+(-40.35/5)-(-4*3))") print(ret)
执行输出: ['-40.35']
匹配小数或者整数
import re ret=re.findall(r"-?\d+\.\d*|-?\d+","1-2*(60+(-40.35/5)-(-4*3))") print(ret)
执行输出:
['1', '-2', '60', '-40.35', '5', '-4', '3']
加括号,优先匹配数字
['1', '-2', '60', '', '5', '-4', '3']
执行输出:
['1', '-2', '60', '', '5', '-4', '3']
删除空格
import re
ret=re.findall(r"-?\d+\.\d*|(-?\d+)","1-2*(60+(-40.35/5)-(-4*3))")
ret.remove('')
print(ret)
执行输出:
['1', '-2', '60', '5', '-4', '3']
数字匹配
1、 匹配一段文本中的每行的邮箱
http://blog.csdn.net/make164492212/article/details/51656638
2、 匹配一段文本中的每行的时间字符串,比如:‘1990-07-12’;
分别取出1年的12个月(^(0?[1-9]|1[0-2])$)、
一个月的31天:^((0?[1-9])|((1|2)[0-9])|30|31)$
3、 匹配qq号。(腾讯QQ号从10000开始) [1,9][0,9]{4,}
4、 匹配一个浮点数。 ^(-?\d+)(\.\d+)?$ 或者 -?\d+\.?\d*
5、 匹配汉字。 ^[\u4e00-\u9fa5]{0,}$ 或者..
6、 匹配出所有整数
爬虫练习
先看一下,爬虫的过程
https://movie.douban.com/top250
豆瓣电影 Top 250
import requests import re import json def getPage(url): response=requests.get(url) return response.text def parsePage(s): com=re.compile('<div class="item">.*?<div class="pic">.*?<em .*?>(?P<id>\d+).*?<span class="title">(?P<title>.*?)</span>' '.*?<span class="rating_num" .*?>(?P<rating_num>.*?)</span>.*?<span>(?P<comment_num>.*?)评价</span>',re.S) ret=com.finditer(s) for i in ret: yield { "id":i.group("id"), "title":i.group("title"), "rating_num":i.group("rating_num"), "comment_num":i.group("comment_num"), } def main(num): url='https://movie.douban.com/top250?start=%s&filter='%num response_html=getPage(url) ret=parsePage(response_html) print(ret) f=open("move_info7","a",encoding="utf8") for obj in ret: print(obj) data=json.dumps(obj,ensure_ascii=False) f.write(data+"\n") if __name__ == '__main__': count=0 for i in range(10): main(count) count+=25