1.常用匹配符
‘.‘ 默认匹配除\n之外的任意一个字符,若指定flag DOTALL,则匹配任意字符,包括换行 ‘^‘ 匹配字符开头,若指定flags MULTILINE,这种也可以匹配上(r"^a","\nabc\neee",flags=re.MULTILINE) ‘$‘ 匹配字符结尾,或e.search("foo$","bfoo\nsdfsf",flags=re.MULTILINE).group()也可以 ‘*‘ 匹配*号前的字符0次或多次,re.findall("ab*","cabb3abcbbac") 结果为[‘abb‘, ‘ab‘, ‘a‘] ‘+‘ 匹配前一个字符1次或多次,re.findall("ab+","ab+cd+abb+bba") 结果[‘ab‘, ‘abb‘] ‘?‘ 匹配前一个字符1次或0次 ‘{m}‘ 匹配前一个字符m次 ‘{n,m}‘ 匹配前一个字符n到m次,re.findall("ab{1,3}","abb abc abbcbbb") 结果‘abb‘, ‘ab‘, ‘abb‘] ‘|‘ 匹配|左或|右的字符,re.search("abc|ABC","ABCBabcCD").group() 结果‘ABC‘ ‘(...)‘ 分组匹配,re.search("(abc){2}a(123|456)c", "abcabca456c").group() 结果 abcabca456c ‘\A‘ 只从字符开头匹配,re.search("\Aabc","alexabc") 是匹配不到的 ‘\Z‘ 匹配字符结尾,同$ ‘\d‘ 匹配数字0-9 ‘\D‘ 匹配非数字 ‘\w‘ 匹配[A-Za-z0-9] ‘\W‘ 匹配非[A-Za-z0-9] ‘s‘ 匹配空白字符、\t、\n、\r , re.search("\s+","ab\tc1\n3").group() 结果 ‘\t‘
2.常用的匹配语法
re.match 从头开始匹配
re.search 匹配包含
re.findall 把所有匹配到的字符放到以列表中的元素返回
re.splitall 以匹配到的字符当做列表分隔符
re.sub 匹配字符并替换
- ^$: 配合使用叫做精准匹配,如何限制一个字符串的长度或者内容。 - |: 或。ab|abc如果第一个条件成立,则abc不会执行,怎么解决,针对这种情况把长的写在前面就好了,一定要将长的放在前面。 - [^...]: 表示取反的意思。 - [^ab]: 代表只去ab以外的字符。 - [^a-z]: 取a-z以外的字符
3. 实例
import re str1 = ‘sean tank Ason‘ #findall res = re.findall(‘[a-s]{4}‘, str1) # 从字符串依次取出4个 print(res) # [‘sean‘, ‘tank‘, ‘json‘] # search res = re.search(‘[a-z]{4}‘, str1) #找到就结束 print(res) print(res.group()) # match res = re.match(‘sean‘, str1) print(res) print(res.group()) if res: print(res.group()) 结果: [‘sean‘] <_sre.SRE_Match object; span=(0, 4), match=‘sean‘> sean <_sre.SRE_Match object; span=(0, 4), match=‘sean‘> sean sean
4.爬虫实例
‘‘‘ 爬取豆瓣TOP250电影信息 第1页: https://movie.douban.com/top250?start=0&filter= ... 第9页: https://movie.douban.com/top250?start=200&filter= 第10页: https://movie.douban.com/top250?start=225&filter= 爬蟲四部原理: 1.发送请求: requests 2.获取响应数据: 对方机器直接返回的 3.解析并提取想要的数据: re 4.保存提取后的数据: with open() 爬蟲三部曲: 1.发送请求 2.解析数据 3.保存数据 # 往10个链接发送请求获取响应数据 - requests模块 ---》 请求库 ‘‘‘ import requests import re # 爬蟲三部曲: # 1.发送请求 def get_page(url): response = requests.get(url) # response.content # 获取二进制流数据,比如图片、视频、音频 # response.text # 获取响应文本,比如html代码 return response # 2.解析数据 # 伪代码: # response = get_page(‘url地址‘) # parser_page(response.text) def parser_page(text): # response.text # re.findall(‘正则表达式‘, ‘过滤的文本‘) res_list = re.findall( ‘<div class="item">.*?<a href="(.*?)">.*?<span class="title">(.*?)</span>.*?<span class="rating_num".*?>(.*?)</span>.*?<span>(.*?)人评价‘, text, re.S) for movie_tuple in res_list: # print(movie_tuple) yield movie_tuple # 3.保存数据 # 伪代码: # res_list = parser_page(text) # save_data(res_list) def save_data(res_list_iter): with open(‘douban.txt‘, ‘a‘, encoding=‘utf-8‘) as f: for movie_tuple in res_list_iter: movie_url, movie_name, movie_point, movie_num = movie_tuple # 写入文件前的模样 str1 = f‘‘‘ 电影地址: {movie_url} 电影名字: {movie_name} 电影评分: {movie_point} 评价人数: {movie_num} ‘‘‘ f.write(str1) # 获取10个链接 n = 0 for line in range(10): url = f‘https://movie.douban.com/top250?start={n}&filter=‘ n += 25 print(url) response = get_page(url) res_list_iter = parser_page(response.text) # print(res_list_iter) save_data(res_list_iter)
输出结果:
https://movie.douban.com/top250?start=0&filter=
https://movie.douban.com/top250?start=25&filter=
https://movie.douban.com/top250?start=50&filter=
https://movie.douban.com/top250?start=75&filter=
https://movie.douban.com/top250?start=100&filter=
https://movie.douban.com/top250?start=125&filter=
https://movie.douban.com/top250?start=150&filter=
https://movie.douban.com/top250?start=175&filter=
https://movie.douban.com/top250?start=200&filter=
https://movie.douban.com/top250?start=225&filter=
原文:https://www.cnblogs.com/bigbox/p/11892364.html