一、今日内容

python中的方法
python中的方法+正则表达式的新内容
#分组
#分组命名
#引用分组
#爬虫的小例子

1、转义符

如:\n--->\\n--->print('\\n')#\n
如:print('\\\\n')#\\n
print(r'\n')
print(r'\\n')
#正则表达式中的转义符在python的字符串中也刚好有转义的作用
#但是正则表达式中的转义和字符串中的转义符并没关系
#且还容易冲突
#为避免这种冲突
#我们所有的正则都以工具中的测试结果为结果
#然后只需要在正则和待匹配的字串外面的都加‘r’即可。
如:
print(r'\n')
print(r'\\n')

2、re模块(findall,search,match)

import re
ret=re.findall('\d',alex83)
ret=re.findall('\d+',alex83)
print(ret)
#findall会匹配字符串中所有符合规则的项
#并返回一个列表
#如果未匹配到返回空列表
ret=re.search('\d','alex83')
print(ret)#如果能匹配上返回一个对象,如果不能匹配,返回none
if ret:
print(ret.group())#8
#如果是对象,那么这个对象内部实现了group,所以可以取值。
#如果是none,那么这个对象不可能实现了group方法,所以报错
#会从头到尾从带匹配匹配字符串中取出第一个符合条件的项。
#如果匹配到了,返回一个对象,用group取值。
#如果没匹配到,返回none,不能用group。
ret=re.search('\d+','alex83')
print(ret)
print(ret.group())#83 re.match
ret=re.match('\d','6alex83')==re.match('^\d','6alex83')
print(ret)
print(ret.group())#6
#会从头匹配字符串中取出从第一个字符开始是否符合规则
#如果符合,就返回对象,用group取值。
#如果不符合,就返回none
#match=search+正则

3、re其他方法及拓展

1、时间复杂度,效率 compile
#在同一个正则表达式重复使用多次的时候使用能够减少时间开销。
2、空间复杂度,内存占用率 finditer
#在查询的结果超过1个情况下,能够有效的节省内存,降低空间复杂度,从而也降低了时间复杂度。
3、用户体验
大数据量的时候:
import re
ret=re.findall('\d','alhlajanlha12llhlajlmahlj4'*2000000)
print(ret) =====
import re
ret=re.finditer('\d','alhlajanlha12llhlajlmahlj4'*2000000)
for i in ret:#迭代出来的每一项都是一个对象
print(i.group())#通过group取值即可 re.compile()
#\d正则表达式,---》字符串
#\d str,循环str,找到所有的数字。 s = '<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>'
ret=re.compile('\d+')
print(ret)
r1=ret.search('alex83')
print(r1)
print(r1.group())
ret.findall('wusu74')
ret.finditer('taibai40')
#finditer作用:
r3=ret.finditer('taibai40')
print(r3)
for i in r3:
print(i.group()) #re.sub
#re.split import re ret=re.split('\d+','alex83wusir74taibai50')#默认只保留分组中的内容
print(ret)
#['alex', 'wusir', 'taibai', ''],以数字分割,最后一个空字符,是50切割出来的。 import re ret=re.split('(\d+)','alex83wusir74taibai50')
print(ret)
#['alex', '83', 'wusir', '74', 'taibai', '50', '']
ret=re.split('\d(\d)','alex83wusir74taibai50')
print(ret)
#['alex', '3', 'wusir', '4', 'taibai', '0', ''] import re
ret=re.sub('\d','D','alex83wusir74taibai50')
print(ret)
rett=re.subn('\d','D','alex83wusir74taibai50')
print(rett) alexDDwusirDDtaibaiDD
('alexDDwusirDDtaibaiDD', 6) 总结:
findall 参数顺序和数据类型,返回值类型
search
match
compile
finditer
sub
subn

(1)、分组的概念和re模块

s1 = '<h1>wahaha</h1>'
s2 = '<a>wahaha ya wahaha</a>' ret=re.search('<(\w+)>(.*?)</\w+>',s1)
print(ret)
print(ret.group())#默认为0,取所有
print(ret.group(1))#第一个分组
print(ret.group(2))#第二个分组
#另解方法:[a-z\d]+ 分组命名方法:
s1 = '<h1>wahaha</h1>'
s2 = '<a>wahaha ya wahaha</a>' ret=re.search('<(?P<tag>\w+)>(?P<cont>.*?)</\w+>',s1)
print(ret)
print(ret.group())#默认为0,取所有
print(ret.group("tag"))#tag分组
print(ret.group("cont"))#cont分组
分组命名:
(?P<名字>正则表达式)
引用分组(?P=组名)这个组中的内容必须完全和之前已经存在的组匹配到的内容一模一样。
引用分组:
s1=<h1>wahaha</h1>
ret=re.search('<(?P<tag>\w+)>.*?</(?P=tag)>',s1)
print(ret)
print(ret.group('tag')) ==== ret=re.search(r'<(\w+)>.*?</\1>',s1)#转义1(\1)的用法,如果不加r,\1为空。
print(ret)
print(ret.group(1)) 总结:
splist
#会保留分组中应该被切割掉的内容
分组命名
(?P<命名>正则) search group('组名')
引用分组
(?P=组名)表示这个组中的内容必须和之前已经存在的一组匹配到的内容完全一致。
分组和findall
#默认findall优先显示分组内的内容
#取消分组优先显示(?:正则) 实例: import re ret=re.findall('\d(\d)','al1xel83')
#findall遇到正则表达式中的分组,会优先显示分组中的内容
print(ret)
ret0=re.findall('\d+(\.\d+)?','1.234+2')
print(ret0)
ret1=re.findall('\d+(?:\.\d+)?','1.234+2')
print(ret1) ['3']
['.234', '']
['1.234', '2'] #例题:
#有的时候我们想匹配的内容包含在不相匹配的内容当中,这个时候只需要把不想匹配的先匹配出来,再通过手段去掉。
import re
ret=re.findall("\d+\.\d+|\d","1-2*(60+(-40.35/5)-(-4*3))")
ret1=re.findall("\d+\.\d+|(\d)","1-2*(60+(-40.35/5)-(-4*3))")
print(ret)
print(ret1)
ret1.remove('')
print(ret1)

(2)爬虫实例(爬豆瓣)

import requests
import re
N=0
header={'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36'}
for n in range(10):
ret=requests.get('https://movie.douban.com/top250?start=%s&filter='%(N,),headers=header)
content=ret.text
parrter='<div class="item">.*?<em class="">(?P<id>\d+)</em>.*?<span class="title">(?P<title>.*?)</span>.*?<span class="rating_num" property="v:average">(?P<score>.*?)</span>.*?<span>(?P<num>.*?)人评价</span>'
res=re.finditer(parrter,content,flags=re.S)#如果使用findall,产生的内容放在列表中,列表每个元素都是一个元组。
for i in res:
print({'id':i.group('id'),'title':i.group('title'),'score':i.group('score'),'num':i.group('num')})
N+=25

(3)递归和堆栈(实现三级菜单的返回和退出功能)

一、递归
menu = {
'北京': {
'海淀': {
'五道口': {
'soho': {},
'网易': {},
'google': {}
},
'中关村': {
'爱奇艺': {},
'汽车之家': {},
'youku': {},
},
'上地': {
'百度': {},
},
},
'昌平': {
'沙河': {
'老男孩': {},
'北航': {},
},
'天通苑': {},
'回龙观': {},
},
'朝阳': {},
'东城': {},
},
'上海': {
'闵行': {
"人民广场": {
'炸鸡店': {}
}
},
'闸北': {
'火车战': {
'携程': {}
}
},
'浦东': {},
},
'山东': {},
} def func_menu(menu):
while True:
for key in menu:
print(key)
nip=input("请输入:").strip()
if nip.upper()=='Q':#退出
return 'q'
if nip.upper()=="B":#返回上级
return #return 返回上一级
elif menu.get(nip):
flag=func_menu(menu[nip])
if flag=='q':return 'q' func_menu(menu) 二、堆栈 lst=[menu]
print(lst[-1].keys())
while lst:
for key in lst[-1]:
print(key)
inp=input('>>>')
if inp.upper()=='Q':break
elif inp.upper()=='B':lst.pop()
elif lst[-1].get(inp):
lst.append(lst[-1][inp])

(4)使用listdir求文件夹大小

import os
path1=r'E:\新建文件夹\teaching_plan'
lst=[path1]
size=0
while lst:
path=lst.pop()
name_lst=os.listdir(path)
for name in name_lst:
full_name=os.path.join(path,name)
if os.path.isdir(full_name):
lst.append(full_name)
elif os.path.isabs(full_name):
size+=os.path.getsize(full_name)
print(size)

python笔记26的更多相关文章

  1. python笔记 - day5

    python笔记 - day5 参考: http://www.cnblogs.com/wupeiqi/articles/5484747.html http://www.cnblogs.com/alex ...

  2. guxh的python笔记一:数据类型

    1,基本概念 1.1,数据类型 基本数据类型:字符串,数字,布尔等 引用数据类型:相对不可变(元组),可变(列表,字典,集合等) 基本数据类型存放实际值,引用数据类型存放对象的地址(即引用) ==:判 ...

  3. python笔记-1(import导入、time/datetime/random/os/sys模块)

    python笔记-6(import导入.time/datetime/random/os/sys模块)   一.了解模块导入的基本知识 此部分此处不展开细说import导入,仅写几个点目前的认知即可.其 ...

  4. Python笔记之不可不练

    如果您已经有了一定的Python编程基础,那么本文就是为您的编程能力锦上添花,如果您刚刚开始对Python有一点点兴趣,不怕,Python的重点基础知识已经总结在博文<Python笔记之不可不知 ...

  5. boost.python笔记

    boost.python笔记 标签: boost.python,python, C++ 简介 Boost.python是什么? 它是boost库的一部分,随boost一起安装,用来实现C++和Pyth ...

  6. 20.Python笔记之SqlAlchemy使用

    Date:2016-03-27 Title:20.Python笔记之SqlAlchemy使用 Tags:python Category:Python 作者:刘耀 博客:www.liuyao.me 一. ...

  7. Python笔记——类定义

    Python笔记——类定义 一.类定义: class <类名>: <语句> 类实例化后,可以使用其属性,实际上,创建一个类之后,可以通过类名访问其属性 如果直接使用类名修改其属 ...

  8. 13.python笔记之pyyaml模块

    Date:2016-03-25 Title:13.Python笔记之Pyymal模块使用 Tags:Python Category:Python 博客地址:www.liuyao.me 作者:刘耀 YA ...

  9. 8.python笔记之面向对象基础

    title: 8.Python笔记之面向对象基础 date: 2016-02-21 15:10:35 tags: Python categories: Python --- 面向对象思维导图 (来自1 ...

随机推荐

  1. python后端面试第五部分:Linux操作系统--长期维护

    ##################     Linux操作系统      ####################### 1,讲一下你常用的Linux/git命令和作用: 2,查看当前进程是用什么命 ...

  2. MySQL性能优化的21条最佳经验

    英文原文:<Top 20+ MySQL Best Practices>,编译:陈皓 今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数据库的性能,这并不只 ...

  3. Python面向对象三大特征

    继承 面向对象中的继承就是继承的类直接拥有被继承类的属性而不需要在自己的类体中重新再写一遍,其中被继承的类叫做父类.基类,继承的类叫做派生类.子类.在python3中如果不指定继承哪个类,默认就会继承 ...

  4. FFT算法的verilog实现

    首先需要明白傅里叶相关的基本知识:还是 借用这位英雄的文章,真心写的让人佩服不已http://blog.jobbole.com/70549/ 然后是卷积的理解http://blog.csdn.net/ ...

  5. 实现api开发实例页面

    主要实现功能: 1.通过点击不同的option选项,自动生成不同的代码. 功能分析: 1.点击不同的option选项,这里其实就是使用了一个事件即onchange,把这个事件放在<select& ...

  6. <JZOJ5913>林下风气

    快乐dp 反正考场写挂 #include<cstdio> #include<cstring> #include<cctype> #include<iostre ...

  7. tf.estimator

    estimator同keras是tensorflow的高级API.在tensorflow1.13以上,estimator已经作为一个单独的package从tensorflow分离出来了.estimat ...

  8. python socket粘包及实例

    1.在linux中经常出现粘包的出现(因为两个send近靠着,造成接受到的数据是在一起的.)解决方法: 在服务端两send的中间中再添加一个recv(),客户端添加一个send(),服务端收到信息确认 ...

  9. Python---9高级特性

    一.切片 取一个list或tuple的部分元素是非常常见的操作.比如,一个list如下: >>> L = ['Michael', 'Sarah', 'Tracy', 'Bob', ' ...

  10. “代码量统计脚本”

    概述 本文从一段统计C/C++程序脚本入手,记录shell脚本常用和重要的知识点. 代码量统计程序 文件名称,count_code_line.sh 12345678910111213141516171 ...