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. Swagger Annotation 详解(建议收藏)

    转载:https://www.jianshu.com/p/b0b19368e4a8 在软件开发行业,管理文档是件头疼的事.不是文档难于撰写,而是文档难于维护,因为需求与代码会经常变动,尤其在采用敏捷软 ...

  2. eclipse项目名称后面括号里的名称和项目名称不一样

    解决方案: 1:项目右键-属性(Properties)-Web Project Setting, 改名称注意:这个名字将成为你在浏览器访问的路径 2:打开项目目录的.setting文件夹,随便一个文本 ...

  3. 【MAC】Mac下部分常用的小工具

    Homebrew: 官方介绍:The missing package manager for OS X(OS X 不可或缺的套件管理器) /usr/bin/ruby -e "$(curl - ...

  4. Java 基础【19】代理

    Java 代理(Proxy)模式与现实中的代理含义一致,如旅游代理.明星的经纪人. 在目标对象实现基础上,增加额外的功能操作,由此来扩展目标对象的功能. JavaWeb 中最常见的过滤器.Struts ...

  5. 机器人中的轨迹规划(Trajectory Planning )

    Figure. Several possible path shapes for a single joint 五次多项式曲线(quintic polynomial) $$\theta(t)=a_0+ ...

  6. PowerShe 消息提示框测试

    1. 使用powerShell 弹出一个简单的消息框,代码如下,创建test.ps1脚本文件. $ConfirmPreference = 'None' $ws = New-Object -ComObj ...

  7. ios the request was denied by service delegate for reason unspecified

    报错的情况如下: xcode8(The request was denied by service delegate (SBMainWorkspace) for reason: Unspecified ...

  8. Effective Java 第三版—— 84. 不要依赖线程调度器

    Tips 书中的源代码地址:https://github.com/jbloch/effective-java-3e-source-code 注意,书中的有些代码里方法是基于Java 9 API中的,所 ...

  9. Mac 上安装maven

    http://maven.apache.org/download.cgi 官网下载bin.tar 解压后放入某个目录: 配置环境变量: vim .bash_profile M2_HOME=/maven ...

  10. Git忽略规则.gitignore忽略node_modules文件夹

    在项目文件夹里添加.gitignore的文件 打开文件,在里面添加 /node_modules