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. C# 多线程參数传递

    1.通过实体类来传递(能够传递多个參数与获取返回值),demo例如以下: 须要在线程中调用的函数: namespace ThreadParameterDemo { public class Funct ...

  2. [Java] zjdbcping:JDBC数据库连接测试工具

    作者: zyl910 一.缘由 当数据库服务器很多时,或者要与第三方公司做数据库表交换时,此时觉得若有一个简单快捷的数据库连接测试工具就好了. 因为若是采取直接把程序部署到tomcat等容器再测试的办 ...

  3. 关于Discuz! X系列UC_Server 本地文件包含漏洞

    最近又发现discuz论坛被挂马了,决定好好研究一下discuz的漏洞,技术债始终要还是要还的 一.问题发现 快要睡觉的时候,突然收到一封邮件,发现服务器上的文件被篡改了,立即登录服务器,清空恶意文件 ...

  4. mac下安装xampp、及其之上的组件安装

    由于mac下开发需要用到php7,这里是用的xampp集成开发版本.但是mac下安装xampp失败,失败信息如下: Error starting "XAMPP" stack: fa ...

  5. matplotlib 与 seaborn 中出现中文乱码的解决方法

      Linux.Mac osx 系统中,出现 matplotlib 或 seaborn 绘图中有中文乱码的情形,可以考虑使用以下方式处理: 到 anaconda 的 matplotlib 中查看是否有 ...

  6. Android Studio项目导入aar包报错

    最近在试着接入TrPay的sdk,根据它家文档需要导入它们的aar包(paysdk-release-1.2.2.aar). 在AS中怎么给安卓项目导入aar包,网上搜一下就能看到无非也就下面三步: 1 ...

  7. netMarketing类库: 类库说明

    这个类库是作者工作中使用的私人类库,本类库适用于自动化行业的软件工程师使用.如果大家在使用中有任何疑问和建议欢迎联系作者, 或者在页面留言. (一) 引用类库 本类库的环境为.net framewor ...

  8. FasterRCNN 提升分类精度(转)

    近年来,随着深度学习的崛起,计算机视觉得到飞速发展.目标检测作为计算机视觉的基础算法,也搭上了深度学习的快车.基于Proposal的检测框架,从R-CNN到Faster R-CNN,算法性能越来越高, ...

  9. 基数计数——HyperLogLog

    所谓的基数计数就是统计一组元素中不重复的元素的个数.如统计某个网站的UV,或者用户搜索网站的关键词数量:再如对一个网站分别统计了三天的UV,现在需要知道这三天的UV总量是多少,怎么融合多个统计值. 1 ...

  10. 分析“HTTP500内部服务器错误”解决方法

    系统中出现的一些故障是用户最不想看到的,有时候遇到一些故障都到折腾个大半天才能够搞定.打开网站出现了HTTP500内部服务器错误的提示,无法法查看错误的详细信息,用户也没办法根据具体的问题来解决,这对 ...