一 . re
1. import re
findall() 查找所有结果
finditer() 查找到的结果返回迭代器
search() 查找. 如果查找到第一个结果,就停止. 如果查找不到结果,返回None
match() 从头开始找,找到第一个就停止
import re

# findall()
lst = re.findall('a', 'adfssafdseaa')
print(lst) # finditer()
it = re.finditer('\d+', '这个月28号又发了10000元') # 28 10000
print(it) # <callable_iterator object at 0x000001B488083940> 迭代器
for el in it: # 从迭代器中获取到的el是分组的信息
print(el.group()) # 获取具体信息 # search()
ret = re.search('z', 'adfasfgfewa') # 如果查找不到返回None,则无法调用group,会报错
print(ret.group()) # match()
ret = re.match('a', 'dasffgsafads') # 开头不是a,返回None, ret=None,无法调用group,会报错
print(ret.group())

示例

    2. 操作
1. split 切割.按照正则切割
2. sub 替换 subn 替换并显示替换次数
import re
lst = re.split(r'a', 'afssgsdaafgew') # 切a
print(lst) lst1 = re.split(r'[ab]', 'abadffdsabgsagewr') # 切a或b
print(lst1) line = 'abc aa;bb,cc | dd(xx).xxx 12.12\' xxxx' # 按空格切
print(re.split(r' ', line))
print(re.split(r'[ ]', line))
# 按空白切
print(re.split(r'\s', line))
print(re.split(r'[\s]', line))
# 多字符匹配
print(re.split(r'[;,]', line))
# 使用括号捕获分组的时候,默认保留分割符
print(re.split(r'([;])', line))
# 去掉;
print(re.split(r'(?:;)', line))
print(re.split(r';', line))

split示例

import re
# sub 替换
ret = re.sub('', '__sb__', 'alex250taibai250wusir250dd')
print(ret)
# 显示替换了多少次
ret1 = re.subn('', '__sb__', 'alex250taibai250wusir250dd')
print(ret1)

sub和subn示例

    

  爬虫重点: 用compile编译正则表达式

# 爬虫重点
# eval, exec, compile 内置函数回顾
import re
# c = compile('code', 'filename', 'mode') # 代码, 文件名, 模式(eval执行并返回结果, exec执行,不返回结果, single当存放的代码有交互时使用)
li = re.findall(r'\d+', '小明昨天赚了5000块, 小红赚了1000块')
print(li) obj = re.compile(r'\d+') # 编译正则表达式, 当正则表达式过于复杂很长的时候,可以直接使用,不需要复制到代码中
lst = obj.findall('小明昨天赚了5000块, 小红赚了1000块')
print(lst)

    (?P<名字> 正则) 把正则匹配到的内容分组成"名字"组

import re
obj = re.compile(r'(?P<id>\d+)(?P<name>e+)') # 从正则表达式匹配的内容每个组起名

ret = obj.search('abc123eeee') # 搜索
print(ret.group()) # 结果: 123eeee
print(ret.group("id")) # 结果: 123 # 获取id组的内容
print(ret.group("name")) # 结果: eeee # 获取name组的内容

    正则:在python中()表示分组  (?:)去掉python的分组  ()在split中表示保留刀

import re
ret = re.findall('www.(baidu|oldboy).com', 'www.oldboy.com')
print(ret) # ['oldboy'] 这是因为findall会优先把匹配结果组⾥内容返回,如果想要匹
配结果,取消权限即可
ret = re.findall('www.(?:baidu|oldboy).com', 'www.oldboy.com')
print(ret) # ['www.oldboy.com']
import re
ret=re.split("\d+","eva3egon4yuan")
print(ret) #结果 : ['eva', 'egon', 'yuan']
ret=re.split("(\d+)","eva3egon4yuan")
print(ret) #结果 : ['eva', '3', 'egon', '4', 'yuan']
#在匹配部分加上()之后所切出的结果是不同的,
#没有()的没有保留所匹配的项,但是有()的却能够保留了匹配的项,
#这个在某些需要保留匹配部分的使⽤过程是⾮常重要的。

利用优先级问题解决问题,爬取信息

re.S 能忽略掉.不能匹配\n的问题  取值关键

用charset查看编码模式      charset=gb2312  # 编码模式 gbk

import re
from urllib.request import urlopen
import ssl
# ⼲掉数字签名证书
ssl._create_default_https_context = ssl._create_unverified_context
def getPage(url):
response = urlopen(url) # 和网页链接
return response.read().decode('utf-8') # 返回正常的页面源代码, 一大堆HTML
def parsePage(s): # s是页面源代码
ret = re.findall('<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>', s, re.S) # re.S 能忽略掉.不能匹配\n的问题
return ret
def main(num):
url = 'https://movie.douban.com/top250?start=%s&filter=' % num
response_html = getPage(url) # 页面源代码
ret = parsePage(response_html)
print(ret)
count = 0
for i in range(10): # 10⻚
main(count)
count += 25 main(1)
import re
from urllib.request import urlopen def getContent(url):
return urlopen(url).read().decode("gbk")
# # 爬取 http://www.dytt8.net/ 上的内容
url = "http://www.dytt8.net"
content = getContent(url)
# 准备正则
obj = re.compile(r"\[<a .*?>最新电影下载</a>\]<a href='(?P<second_url>.*?)'>.*?</a>", re.S)
second_obj = re.compile(r'<div id="Zoom">.*?译  名(?P<yiming>.*?)<br />◎片  名(?P<pianming>.*?)<br />.*?◎导  演(?P<daoyan>.*?)<br />◎主  演(?P<zhuyan>.*?)<br /><br />◎简  介.*?<td .*?><a href="(?P<download>.*?)">', re.S) it = obj.finditer(content)
for el in it:
second_url = el.group("second_url")
second_content = getContent(url+second_url)
second_it = second_obj.finditer(second_content) # 拿到第二层通过正则匹配到的内容.
print("************************************************************************")
for second_info in second_it:
print(re.sub("[\u3000]", "", second_info.group("yiming")))
print(re.sub("[\u3000]", "", second_info.group("pianming")))
print(re.sub("[\u3000]", "", second_info.group("daoyan")))
print(re.split("<br />", re.sub("[\u3000]", "", second_info.group("zhuyan"))))
print(re.sub("[\u3000]", "", second_info.group("download"))) '''
content = urlopen("http://www.dytt8.net").read().decode('gbk')
因为用到多次,所以写成函数以便调用
def getContent(url):
return urlopen(url).read().decode('gbk') '''

爬取电影信息

import re
from urllib.request import urlopen def getContent(url): # 提取出功能方便多次调用
return urlopen(url).read().decode('gbk') # 获取源码 url = "http://www.dytt8.net"
content = getContent(url) # 获取源码
# print(content) # 可查看源码 # 准备正则
regular1 = re.compile(r"最新电影下载</a>]<a href='(?P<info_url>.*?)'>.*?</a><br/>", re.S)
regular2 = re.compile(r'◎译  名 (?P<trans_name>.*?)<br />◎片  名 (?P<name>.*?)<br />.*?◎豆瓣评分 (?P<grade>.*?)/10'+
' from (?P<grade_num>.*?) users <br />.*?◎导  演 (?P<director>.*?) <br />◎主  演 (?P<actors>.*?) <br /><br />◎简  介'+
'.*?bgcolor="#fdfddf"><a href="(?P<download_url>.*?)">', re.S) name_url_iter = re.finditer(regular1, content)
for el in name_url_iter:
info_url = el.group('info_url')
content2 = getContent(url + info_url)
info_iter = regular2.finditer(content2)
for el2 in info_iter:
print('*****************************************************************************')
print('译名:', el2.group('trans_name'))
print('片名:', el2.group('name'))
print('豆瓣评分:', el2.group('grade'))
print('评分数量:', el2.group('grade_num'))
print('导演:', el2.group('director'))
print('主演:', re.split(r' <br />      ', el2.group('actors').replace('&middot;', '·')))
print('下载地址:', el2.group('download_url'))

我的版本

import re, json
from urllib.request import urlopen def getContent(url): # 提取出功能方便多次调用
# print(url)
return urlopen(url).read().decode('gbk') # 获取源码 f = open('更多电影.txt', mode='a', encoding='utf-8')
# 准备正则
regular1 = re.compile(r'<b>.*?<a href="(?P<info_url>.*?)".*?', re.S)
regular2 = re.compile(r'◎译  名 (?P<trans_name>.*?) <.*?名 (?P<name>.*?) <.*?代 (?P<date>.*?) <.*?评分 ' +
'(?P<grade>.*?)/.*?bgcolor="#fdfddf"><a href="(?P<download_url>.*?)">', re.S) for i in range(4):
url = "http://www.dytt8.net/html/gndy/dyzz/list_23_%s.html" % (i+1)
content = getContent(url) # 获取源码
# print(content) # 可查看源码 name_url_iter = re.finditer(regular1, content)
for el in name_url_iter:
info_url = el.group('info_url')
content2 = getContent('http://www.dytt8.net' + info_url)
info_iter = regular2.finditer(content2)
for el2 in info_iter:
# print('*****************************************************************************')
print('译名:', el2.group('trans_name'))
print('片名:', el2.group('name'))
print('豆瓣评分:', el2.group('grade'))
print('上映日期:', el2.group('date'))
print('下载地址:', el2.group('download_url'))
dic = {}
dic['译名'] = el2.group('trans_name')
dic['片名'] = el2.group('name')
dic['豆瓣评分'] = el2.group('grade')
dic['上映日期'] = el2.group('date')
dic['下载地址:'] = el2.group('download_url')
s = json.dumps(dic, ensure_ascii=False) + '\n'
f.write(s) f.close()

爬更多页,写入文件

二. 模块

     模块就是⼀个包含了python定义和声明的⽂件, ⽂件名就是模块的名字加上.py后缀. 换句话说我们⽬前写的所有的py⽂件都可以
     看成是⼀个模块,但是我们import加载的模块⼀共分成四个通⽤类别:
       1. 使⽤pyhton编写的py⽂件
       2. 已被编译为共享库或者DLL或C或者C++的扩展
       3. 包好⼀组模块的包.
       4. 使⽤c编写并连接到python解释器的内置模块 import 模块名
1. 检查是否已经导入过 , 顺序, 内存-> 内置 -> sys.path
2. 如果没有导入过这个模块. 先创建一个名称空间
3. 然后把导入的模块执行一遍. 把执行的结果放在刚才的空间中
4. 当没有as的时候是使用模块的名字来引用这个名称空间. 当有as的时候. 用as的名字命名空间
# 创建文件yitian.py
print("啊` 啊 啊啊 啊啊啊啊啊 啊!!!!") main_person_man = "张无忌"
main_person_woman = "赵敏" bad_person_one = "成昆"
bad_person_two = "周芷若" def fight_on_light_top(): print(main_person_man, "粉碎了",bad_person_one ,"的阴谋") def fight_in_shaolin():
print(main_person_man, "粉碎了", bad_person_two, "的阴谋")

创建文件yitian.py,文件名yitian即模块名

import yitian as yt

print(yt.main_person_man)
yt.fight_in_shaolin() # 调⽤模块中的函数
yt.fight_on_light_top() print(globals()) # 可以查看 当前空间中引入的内容 # # 模块的加载顺序: 从内存里找. -> 内置 -> sys.path
# import sys
# print(sys.modules.keys()) # 查看到已经引入的模块信息
# print(sys.path)

导入模块,模块名更改

      在Python中模块是不能够重复导入的. 当重复导入模块时. 系统会根据sys.modules来判断该模块是否已经导入了. 如果已经导入. 则不会重复导入

import sys
print(sys.modules.keys()) # 查看导⼊的模块.
import yitian # 导⼊模块. 此时会默认执⾏该模块中的代码
import yitian # 该模块已经导⼊过了. 不会重复执⾏代码
import yitian
import yitian
import yitian
import yitian
        所有被导入的模块都会放在sys.modules字典里
     使用模块中的内容. 模块名字.方法/变量/类
from time import *   # 引入time模块的所有对象. *代表所有对象: 变量,类,函数,引入后调用无需 模块名. 直接使用即可time()  如果直接import time,则调用时需要time.time()
print(time()) print(sys.path) # 查看路径
print(sys.modules) # 查看导入的模块,是一个字典
print(sys.modules.keys())
     
     由于模块在导入的时候会创建其⾃⼰的名称空间. 所以. 我们在使⽤模块中的变量的时候⼀般是不会产⽣冲突的.
import yitian
main_person_man = "胡⼀菲"
def fight_in_shaolin():
print(main_person_man, "⼤战曾⼩贤")
print(yitian.main_person_man) # 张⽆忌
print(main_person_man) # 胡⼀菲
yitian.fight_in_shaolin() # 倚天屠⻰记中的
fight_in_shaolin() # ⾃⼰的
        __name__:
如果当前模块是程序的入口. __name__的值:__main___
如果模块是被其他模块引入的. __name__是模块名
⾦庸:
import yitian
yitian.main_person_man = "灭绝师太"
⾦庸⼆号:
import yitian
import ⾦庸
print(yitian.main_person_man) # 灭绝师太. ⾦庸:
print(__name__)
# 此时如果运⾏该⽂件. 则__name__是__main__
⾦庸⼆号:
import ⾦庸
#此时打印的结果是"⾦庸" (引入的模块名,在哪个引入模块中调用__name__,则显示哪个模块名)

      我们可以利⽤这个特性来控制模块内哪些代码是在被加载的时候就运⾏的. 哪些是在模
    块被别⼈导入的时候就要执⾏的. 也可以屏蔽掉⼀些不希望别⼈导入就运⾏的代码. 尤其是测
    试代码.

if __name__ == '__main__':
yitian.main_person_man = "灭绝师太" # 此时, 只有从该模块作为⼊⼝运⾏的时候才
会把main_person_man设置成灭绝师太
print("哇哈哈哈哈哈") # 只有运⾏该模块才会打印. import的时候是不会执⾏这⾥的代
码的

    一次可以引入多个模块

import time, random, json, yitian
        from xxx import xxx
from 模块 import 模块中的内容
from 模块 import * 不推荐 导入的内容可以直接使用. 不需要模块.xxx. 不要和当前模块中的变量冲突
from yitian import main_person_man   #也可以一行引入多个,也支持as改名字

main_person_man = "灭绝" #  引入的名字和自己的变量是冲突的
print(main_person_man) # 先找 内存=>内置=>模块 此处打印自己的变量

所以. 不要重名. 切记. 不要重名! 不仅仅是变量名不要重复.我们⾃⼰创建的py⽂件的名字不要和系统内置的模块重名. 否则. 引入的模块都是python内置的模块. 切记, 切记.

如果确实需要用同样的名字,可以 my_模块名.py  e.g. my_sys.py

Day25--Python--re,模块(regular expression)的更多相关文章

  1. Python正则表达式(regular expression)简介-re模块

    Python正则表达式(regular expression)简介-re模块 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 就其本质而言,正则表达式(或RE模块)是一种小型的,高度 ...

  2. Python标准模块—Regular Expressions

    作者:zhbzz2007 出处:http://www.cnblogs.com/zhbzz2007 欢迎转载,也请保留这段声明.谢谢! 1 模块简介 正则表达式是一门小语言,你可以在Python中或者其 ...

  3. Python 模块 re (Regular Expression)

    使用 Python 模块 re 实现解析小工具   概要 在开发过程中发现,Python 模块 re(Regular Expression)是一个很有价值并且非常强大的文本解析工具,因而想要分享一下此 ...

  4. Python正则表达式Regular Expression基本用法

    资料来源:http://blog.csdn.net/whycadi/article/details/2011046   直接从网上资料转载过来,作为自己的参考.这个写的很清楚.先拿来看看. 1.正则表 ...

  5. python(4): regular expression正则表达式/re库/爬虫基础

    python 获取网络数据也很方便 抓取 requests 第三方库适合做中小型网络爬虫的开发, 大型的爬虫需要用到 scrapy 框架 解析 BeautifulSoup 库, re 模块 (一) r ...

  6. python learning Regular Expression.py

    # 正则表达式,又称规则表达式.(英语:Regular Expression,在代码中常简写为regex.regexp或RE),计算机科学的一个概念.正则表达式通常被用来检索.替换那些符合某个模式(规 ...

  7. Python -- 正则表达式 regular expression

    正则表达式(regular expression) 根据其英文翻译,re模块 作用:用来匹配字符串.  在Python中,正则表达式是特殊的字符序列,检查一个字符串是否与某种模式匹配. 设计思想:用一 ...

  8. Python中的正则表达式regular expression

    1 match = re.search(pat,str)  If the search is successful, search() returns a match object or None o ...

  9. 正则表达式-使用说明Regular Expression How To (Perl, Python, etc)

    notepad++ wiki about regular expression 正则表达式-使用说明Regular Expression How To (Perl, Python, etc) http ...

随机推荐

  1. kubernetes资源类别介绍

    类别 名称 资源对象 Pod.ReplicaSet.ReplicationController.Deployment.StatefulSet.DaemonSet.Job.CronJob.Horizon ...

  2. 关于IWMS中遇到的问题及解决方法

    1.生成的文章上传到外网上,但是没一会儿又变成原来的样子? 解决方案:把上传页面对应的template中的.aspx页面也要上传到外网去.

  3. Delphi (Library Path Browsing Path)

    首先要明白的一个概念是dcu文件 *.dcu是*.pas的编译后单元文件(Delphi Compiled Unit), 编译器把它和库文件连接起来就构成了可执行文件*.exe 或*.dll等,相当于C ...

  4. thinkphp5 实现搜索分页能下一页保留搜索条件

    正常情况下: 搜索后分页了,点击第二页,进入页面之前的搜索条件没有了. 如代码 $keywords=$this->request->param('keywords'); $this-> ...

  5. Jenkins+PowerShell持续集成环境搭建(三)Web项目

    1. 新建一个名字为HelloWorld.Web的Freesyle项目: 2. 配置源码管理: 3. 编译配置: 版本:选择MSBuild4 文件:D:\CI\Config\HelloWorld.We ...

  6. rmse均方根误差

    rmse=sqrt(sum((w-r).^2)/length(w))

  7. Atcoder Beginner Contest 121 D - XOR World(区间异或和)

    题目链接:https://atcoder.jp/contests/abc121/tasks/abc121_d 题目很裸(Atcoder好像都比较裸 就给一个区间求异或和 n到1e12 肯定不能O(n) ...

  8. iOS 通知推送APNS

    结合网上各个资料,再简单整理的一份. 一.APNS推送说明 1.你的IOS应用需要去注册APNS消息推送功能. 2.当苹果APNS推送服收到来自你应用的注册消息就会返回一串device token给你 ...

  9. Spring 使用介绍(七)—— Spring事务

    一.数据库事务概述 1.基本介绍 事务必需满足ACID(原子性.一致性.隔离性和持久性)特性,缺一不可: 原子性(Atomicity):即事务是不可分割的最小工作单元,事务内的操作要么全做,要么全不做 ...

  10. js获取参数 解决乱码

    获取参数 function GetQueryString(name) { var reg = new RegExp("(^|&)" + name + "=([^& ...