30  re模块2
一.正则表达式在线测试 在线测试工具 http://tool.chinaz.com/regex/

(一).*?的用法:
. 是任意字符
* 是取 0 至 无限长度
? 是非贪婪模式。
合在一起就是 取尽量少的任意字符,一般不会这么单独写,他大多用在:.*?x
就是取前面任意长度的字符,直到一个x出现
(二).问号"?"的四种用法
1.量词,重复零次或一次
2.非贪婪匹配(惰性匹配)的象征( .*? )
3.?: 分组一开始加?:表示取消分组优先.
4.?p: 分组命名 html 标签预言中用到.
二.re模块常用方法
基础查找
1.findall 分组优先级
ret=re.findall(r"(\d+\.?\d+)","123.546")
print(ret)
print(ret.remove(""))
#findall的优先级问题
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'] 注释: 分组一开始加" ?: " 表示取消分组优先级. 2.search (group)
函数会在字符串内查找模式匹配,直到找到第一个匹配然后返回一个包含匹配信息的对象,该对象可以
通过调用group()方法得到匹配的字符串,如果字符串没有匹配,则返回None。
ret=re.search("\d+","4huhi67377")
print(ret.group()) # 4
ret=re.search("\d+","4888huhi67377")
print(ret.group()) #4888
3.match (group)
ret=re.match("\d","4huhi67377") #match 里的正则不管是什么,默认在正则前加" ^ "
print(ret.group())
字符串处理
4.split 分组保留 优先级"正则" "(正则)"
ret=re.split("(\d+)","ghgh689jhhkjkj888hjh9777") # 用"\d+"切割字符串 加"(正则)"分组保留.
print(ret) #['ghgh', '689', 'jhhkjkj', '888', 'hjh', '9777', '']
ret=re.split("\d+","ghgh689jhhkjkj888hjh9777")
print(ret) #['ghgh', 'jhhkjkj', 'hjh', '']
5.sub 替换 ("正则","替换目标值","字符串",2)
ret=re.sub("\d+" ,"男神","alex1000wusir666")
print(ret) 结果 alex男神wusir男神
ret=re.sub("\d+" ,"男神","alex1000wusir666",1)
print(ret) 结果 alex男神wusir666 6.subn
ret=re.subn("\d+" ,"男神","alex1000wusir666")
print(ret) 结果 ('alex男神wusir男神', 2)
代码优化
7.compile
obj=re.compile("\d{4}")
ret=obj.search("676767hghjj787878gjggu")
print(ret.group()) #结果 6767
ret=obj.findall("hghjj787878gjggu")
print(ret.group()) 结果 6767
ret=obj.match("676767hghjj787878gjggu")
print(ret.group()) #6767
8.finditer 迭代功能
ret=re.finditer("\d+","ggjgu65565765hjhjk767")
for i in ret:
print(i.group()) #65565765 767
<二>
print(ret) # <callable_iterator object at 0x00000278077385C0>
print(next(ret).group()) # 65565765
print(next(ret).group()) # 767
三.综合练习与扩展
1.匹配标签
(1).普通版
ret = re.search("<\w+>\w+</\w+>","<h1>hello</h>")
print(ret.group()) # <h1>hello</h1>
(2).分组命名版
还可以在分组中利用?P<name>的形式给分组起名字,获取的匹配结果可以直接用group('名字')拿到对应的值
ret = re.search("<(?P<tag_name>\w+)>\w+</(?P=tag_name)>","<h1>hello</h1>")
?P<tag_name> 起名字 ?P=tag_name 使用分组名字
print(ret.group("tag_name")) # h1
print(ret.group()) # <h1>hello</h1>
(3)分组索引 从1开始
如果不给组起名字,也可以用"\序号"来找到对应的组,表示要找的内容和前面的组内容一致
获取的匹配结果可以直接用group(序号)拿到对应的值
ret = re.search(r"<(\w+)>\w+</\1>","<h1>hello</h1>")
print(ret.group()) #<h1>hello</h1>
print(ret.group(1)) # h1
2.匹配整数和小数
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'] 小数和整数都取
ret=re.findall(r"-?\d+\.\d+|(-?\d+)","1-2*(60+(-40.35/5)-(-4*3))")
print(ret) # ['1', '-2', '60', '', '5', '-4', '3'] 只取整数
3.数字匹配
(1). 匹配一段文本中的每行的邮箱
http://blog.csdn.net/make164492212/article/details/51656638
正则表达式 : [\w:\./]{1,}
验证: ret=re.findall("[\w:\./]{1,}","http://blog.csdn.net/make164492212/article/details/51656638")
print(ret) # ['http://blog.csdn.net/make164492212/article/details/51656638']
(2).匹配一段文本中的每行的时间字符串,比如:‘1990-07-12’;^[1-9][0-9]{1,}\-[0-1][0-9]\-[0-3][0-9]
分别取出1年的12个月 # (^(0?[1-9]|1[0-2])$)
一个月的31天 # ^((0?[1-9])|((1|2)[0-9])|30|31)$
(3)匹配qq [1-9][0-9]{4,}
(4)浮点数 ^(-?\d+)(\.\d+)?$
四.flags有很多可选值
re.I(IGNORECASE)忽略大小写,括号内是完整的写法
re.M(MULTILINE)多行模式,改变^和$的行为
re.S(DOTALL)点可以匹配任意字符,包括换行符
re.L(LOCALE)做本地化识别的匹配,表示特殊字符集 \w, \W, \b, \B, \s, \S 依赖于当前环境,不推荐使用
re.U(UNICODE) 使用\w \W \s \S \d \D使用取决于unicode定义的字符属性。在python3中默认使用该flag
re.X(VERBOSE)冗长模式,该模式下pattern字符串可以是多行的,忽略空白字符,并可以添加注释
作业: 实现能计算类似
1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )等类似公式的计算器程序
爬虫练习:
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

python全栈开发 * 30知识点汇总 * 180713的更多相关文章

  1. python全栈开发 * 10知识点汇总 * 180612

    10 函数进阶 知识点汇总 一.动态参数 形参的第三种1.动态接收位置传参 表达:*args (在参数位置编写 * 表⽰接收任意内容) (1)动态位置参数def eat(*args): print(a ...

  2. python全栈开发 * 26知识点汇总 * 180709

    26 logging collections random 模块 一.logging低配:日志不能写入文件与显示同时进行 import logging logging.basicConfig(leve ...

  3. python全栈开发 * 01知识点汇总 * 180530

    一 python简介. 1.创始人:  吉多 .范罗苏姆  \   (Guido van Rossum). 2.时间  :  1989年. 3.主要应用领域  :  云计算 \  WEB开发  \   ...

  4. python全栈开发 * 32知识点汇总 * 180717

    32 网络编程 (一)一.架构 定义:程序员开发的一种模式. 分类: C/S 架构 C/S即:Client与Server , 客户端/ 服务器模式 . 缺点 : 冗余 B/S 架构 Browser与S ...

  5. python全栈开发 * 27知识点汇总 * 180710

    27   time  os  sys  模块 time 模块 一.表示时间的三种方式 时间戳(timestamp), 元组(struct_time),格式化时间字符串(Format string) 小 ...

  6. python全栈开发 * 14 知识点汇总 * 180530

    14 生成器表达式 内置函数# 一.迭代器 (补充)# 1.如何判断迭代对象,迭代器# (1).dir(obj)检测对象有没有iter方法,然后it=obj.__iter__() 获取迭代器 , it ...

  7. python全栈开发 * 12 知识点汇总 * 180530

    12 知识点总结 装饰器进阶 ⼀. 通⽤装饰器的回顾1.开闭原则: 对增加功能开放. 对修改代码封闭2.装饰器的作⽤: 在不改变原有代码的基础上给⼀个函数增加功能3.通⽤装饰器的写法:def wrap ...

  8. python全栈开发 * 36知识点汇总 * 180721

    36 操作系统的发展史 进程一.手工操作--穿孔卡片 1.内容: 程序员将对应于程序和数据的已穿孔的纸带(或卡片)装入输入机,然后启动输入机把程序和数据输入计算机内存,接着通过控制 台开关启动程序针对 ...

  9. python全栈开发 * 31知识点汇总 * 180716

    31 模块和包一.模块(一)模块的种类:内置模块,自定义模块,扩展模块第三方模块(二)自定义模块 1.模块的创建 : 新建一个py文件. 2.模块名 : 模块名需要符合变量的命名规范. 3.模块的导入 ...

随机推荐

  1. 在Ubuntu18.04下配置hadoop集群

    服务器准备 启动hadoop最小集群的典型配置是3台服务器, 一台作为Master, NameNode, 两台作为Slave, DataNode. 操作系统使用的Ubuntu18.04 Server, ...

  2. phpBB3导入帖子的Python脚本

    关联的数据表 在phpBB3中导入用户时, 需要处理的有两张表, 一个是 topics, 一个是 posts.为了方便与原数据关联, 需要在这两个表上新增一个字段并建立唯一索引 ALTER TABLE ...

  3. 使用 Docker 镜像构建 GO 语言环境

    1. 安装 Docker 我当前使用的系统环境是 CentOS7 ,安装 Docker 使用的命令是 yum install docker*.至于其它系统,可以到百度查找其对应的安装方式. 2. 配置 ...

  4. H+ 显示并激活menuTab 根据tabName

    //注:在contabs.js文件中 $(function () { }); 方法外 加入//注: data-name="' + menuName + '" 这句是加入的自定义属性 ...

  5. chrome浏览器解决跨域问题

    windows: 右击chrome图标 选择属性 快捷方式 在目标末尾位置,空格,输入--args --disable-web-security --user-data-dir 例如:"C: ...

  6. Android Api 27 在 Android 8.0 上出现 Only fullscreen opaque activities can request orientation 的解决情况

    刚上班,没有业务开发,对 App 的 Api 由 26 升级到了 27, 结果在 Android 8.0 的设备上会出现 crash . Log 如下: java java.lang.IllegalS ...

  7. Xilinx的ISE14.7和PlanAhead与win10系统的兼容性问题解决方案

    Xilinx的ISE14.7和PlanAhead与win10系统的兼容性问题解决方案 2018年07月03日 18:27:57 feq123 阅读数:4495   今天在新电脑的win10系统上安装I ...

  8. 开源文件服务器file-service介绍

    file-service 一个基于ASP.NET Core的可伸缩.通用的文件服务器. 通常后端项目可能会有头像.图片.音频.视频等上传/下载需求,这些需求都可以抽象为文件服务. 功能特点 支持Lin ...

  9. repo命令详解

    Android 为企业提供一个新的市场,无论大企业,小企业都是处于同一个起跑线上.研究 Android 尤其是 Android 系统核心或者是驱动的开发,首先需要做的就是本地克隆建立一套 Androi ...

  10. 怎么让Windows2012和Windows2008多用户同时远程

    具体方法请参照百度经验:http://jingyan.baidu.com/article/cd4c2979f19765756e6e60ec.html.经过实践证明,是没有问题的.