day23 re模块

news/2024/7/19 11:48:54 标签: json, 爬虫

  1. 正则表达式, Regular Expression 是对字符串操作的一种逻辑公式

  优点: 灵活, 功能性强, 逻辑性强.

  缺点: 上⼿难. ⼀旦上⼿, 会爱上这个东⻄

    1. 元字符: [] 的内容会被匹配  例如:[abc] 匹配a或b或c

    思考: [a-zA-Z0-9]匹配的是什么?   按照编码的顺序填写

    2. 简单元字符 (单一字符)

    

  

 

    3. 量词  (限定符)

    

 

     4. 惰性匹配和贪婪匹配

    *, +, {} 属于贪婪匹配,  .*? 属于惰性匹配

    

     5. 分组  用来获取数据

      ()进行分组, 提高优先级, 

    6. 转义 

      正则表达式前面加上 r, 如果遇到需要转义的字符加上 \ 

练习:

1. 匹配邮箱   

2. 匹配⼿机号

3. 匹配⽣⽇. ⽇期格式(yyyy-MM-dd)  

4. 匹配电话号码

5. 匹配IP

 

   2. re模块  关于处理正则表达式的模块, 核心功能有四个:\

     1. findall 查找所有, 返回list, 结合for循环使用

       2. search  匹配到第一个结果, 就返回这个结果, 如果匹配不到返回None

             3. match  只能从字符串的开头进行匹配

       4. finditer  和findall差不多, 但是返回是迭代器,  可以结合for循环使用

import re

res = re.search("e", "alex and exp") # 搜索. 搜到结果就返回
print(res.group())  # e

res = re.match("\w+", "alex is not a good man") #  从头匹配.  如果匹配到了。 就返回
print(res.group())  # alex

lst = re.findall("\w+", "alex and exo")  
print(lst)   # ['alex', 'and', 'exo']

it = re.finditer("\w+", "mai le fo leng")
for el in it:
    print(el.group())  

 

 

    其他操作:

      1. split  根据正则切割

# 加了括号。 split会保留你切的刀
lst = re.split("([ab])", "alex is not a sb, no he is a big sb") # 根据正则表达式进行切割
print(lst)

# ['', 'a', 'lex is not ', 'a', ' s', 'b', ', no he is ', 'a', ' ', 'b', 'ig s', 'b', '']

# 不加括号, 是正常切割
lst = re.split("[ab]", "alex is not a sb, no he is a big sb") # 根据正则表达式进行切割
print(lst)

#['', 'lex is not ', ' s', ', no he is ', ' ', 'ig s', '']

      2. sub, subn 替换

# 替换
res = re.sub(r"\d+", "_sb_", "alex333wusir666taibai789ritian020feng")
print(res)  #alex_sb_wusir_sb_taibai_sb_ritian_sb_feng

# 替换。 返回的结果带有次数
res = re.subn(r"\d+", "_sb_", "alex333wusir666taibai789ritian020feng")
print(res)  #('alex_sb_wusir_sb_taibai_sb_ritian_sb_feng', 4)

     3. compile  正则表达式编译

obj = re.compile(r"alex(?P<name>\d+)and") # 把正则表达式预加载
res = obj.search("alex250andwusir38ritian2")
print(res.group())      # alex250and
print(res.group("name"))        # 250

 

  3. 简单爬虫

   周末作业:

import re, json
from urllib.request import urlopen

def Item(url):
    url_ = urlopen(url).read().decode('gbk')
    obj1 = re.compile(r'<div id="Zoom">.*?◎译  名 (?P<yiming>.*?)<br />.*? <td style=.*?<a href="(?P<download>.*?)">ftp://', re.S)
    it = obj1.finditer(url_)
    for el in it:
        yield {"name": el.group("yiming"), "adress": el.group("download")}


url = urlopen('https://www.dytt8.net').read().decode('gbk')
obj2 = re.compile(r"<td width=.*?最新电影下载.*?<a href='(?P<download>.*?)'>.*?</a><br/>", re.S)
lst = obj2.findall(url)

f = open('movie.json', 'a', encoding="utf-8")
for i in lst:
    add = 'https://www.dytt8.net' + i
    ret = Item(add)
    for el in ret:
        s = json.dumps(el, ensure_ascii=False)
        f.write(s + "\n")
f.close()

 

   

 

 

转载于:https://www.cnblogs.com/Knight-huang/p/9985896.html


http://www.niftyadmin.cn/n/1153283.html

相关文章

Android Studio中添加对HttpClient的支持包

sdk6.0以后取消了HttpClient&#xff0c;设置android SDK的编译版本为23时&#xff0c;且使用了httpClient相关类的库项目&#xff0c;会出现有一些类找不到的错误。 解决方法有两种&#xff1a; 1.在相应的module下的build.gradle中加入&#xff1a; useLibrary org.apache.ht…

linux 常用命令

2019独角兽企业重金招聘Python工程师标准>>> 查看本机地址: ifconfig查看当前登陆用户: who计算用户个数: who | wc -l 注&#xff1a;| 代码管道命令&#xff0c;可以在两程序之间建立管道&#xff1a;who的输出&#xff0c;成了wc的输入。wc所列出的结果就是…

C#线程同步

一&#xff0c;什么是线程同步和互斥 同步就是协同步调&#xff0c;按预定的先后次序进行运行。如&#xff1a;你说完&#xff0c;我再说。如进程、线程同步&#xff0c;可理解为进程或线程A和B一块配合&#xff0c;A执行到一定程度时要依靠B的某个结果&#xff0c;于是停下来&…

com.loopj.android.http报错问题

下载库文件包名是com.loopj.android.http&#xff0c;而报错的地方代码是import cz.msebera.android.httpclient.Header;&#xff0c;可问题是没有cz.msebera.android.httpclient.这个包 解决方法&#xff0c;从这个网站上下载那个JAR包就可导进去&#xff0c;报错的地方就解决…

我使用的Bem的习惯

在基于BEM命名思想的基础上&#xff0c;我整理一些实用的点&#xff1a; BEM&#xff0c;B即block&#xff08;块&#xff09;&#xff0c;E即element&#xff08;元素&#xff09;&#xff0c;M即modifier&#xff08;修饰符&#xff09; 块&#xff1a;最顶层&#xff0c;可包…

java面向对象—抽象类与接口

2019独角兽企业重金招聘Python工程师标准>>> 1、final关键字在java中被称为完结器&#xff0c;表示最终的意思 2、final能声明类&#xff0c;方法&#xff0c;属性&#xff1a; 使用final声明的类不能被继承 使用final声明的方法不能被重写 使用final声明的变量变成…

高逼格关闭Win10防火墙

作为一个开发人员&#xff0c;你还需要进入这个界面来关闭防火墙么&#xff1f; 如果是&#xff0c;那么现在&#xff0c;我将为大家介绍一种高逼格的方式&#xff1a; 第一步&#xff1a; 打开Windows PowerShell(管理员) 第二步&#xff1a;查看当前防火墙状态&#xff1a;ne…