首页 > 其他 > 详细

re模块

时间:2019-11-19 21:51:27      阅读:87      评论:0      收藏:0      [点我收藏+]

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 = fhttps://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=

re模块

原文:https://www.cnblogs.com/bigbox/p/11892364.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!