正则表达式

正则表达式(RE)是一种小型的,高度专业化的,它镶嵌在python中,并通过re模块实现,正则表达式编译成一系列的字节码,然后由用c编写的匹配引擎执行。

#正则表达式
import re
a=re.findall('alex','asdadrenzhanqalexiadaf')#返回的格式是一个列表格式
print(a)#输出 ['alex'] # findall 和finditer的区别是一个返回元组直接一个返回的是一个迭代器
# finditer
p=re.compile(r'\d+')
w=p.finditer('12asfasf12adad12asdads2sfasa3dfsaf')
print(w) # 输出结果是一个迭代器 <callable_iterator object at 0x00000181B8302390>
#可以把这个迭代器遍历出来
for match in w:
print(match.group(),match.span())
#输出结果为
'''
12 (0, 2) 开始位置和结束位置
12 (8, 10)
12 (14, 16)
2 (22, 23)
3 (28, 29)
'''
# search 只寻找到一个就返回,从前到后,后面再多也不匹配
# match 只有在最前面才能匹配到,中间和后面都不能匹配
# findall 将匹配所有的符合,放到一个列表中,其实就是一个个的search匹配后的叠加
import re
origin='hello alex bcd alex lge alex acd 19'
r=re.findall('(a)((\w+)(e))(x)',origin) # 先找最外层的括号,然后在最外层括号找的结果中再寻找对应的第二层括号中,
#把寻找的结果依次放在元组中,最后把所有的元组放在一个列表中
print(r)# 输出结果 [('a', 'le', 'l', 'e', 'x'), ('a', 'le', 'l', 'e', 'x'), ('a', 'le', 'l', 'e', 'x')]
 
# match:  re.match(pattern,string,flag=0)
# flag标志位
# re.I 使匹配对大小写不敏感
# re.L 使本地化识别(locale-aware)匹配
# re.M 多行匹配,影响^ 和 $
# re.S 使.匹配包括换行在内的所有字符(能匹配换行符\n)
# group() 对象方法,返回被RE匹配的字符串,参数默认是0,group(1),group(2)..取相应的组,第一组,第二组..
# groups() 获取模型中匹配到的分组结果
# groupdict() 获取模型中匹配到的分组中所有执行key的组
# 对比 group() groups()  groupdict()
import re
origin='hello alex bcd alex lge alex acd 19'
r= re.match('h(?P<n1>\w+)',origin)
print(r.group()) #不管加不加() 它的匹配结果都为 hello,它返回所有的结果
print(r.groups()) # 只有加上() 它才会有匹配结果 ('ello',),去你已拿到的东西(hello)再做一次筛选
print(r.groupdict())# 不想放在元组中,想放在字典中,但必须要为字典指定key,方法是在每个分组()前面加上?P<n1> ?P<n2>... n1,n2是字典的key
 
# start() 返回匹配开始的位置
# end() 返回匹配结束的位置
# span() 返回一个元组包含匹配(开始,结束)的位置
# sub 替换功能
# re.sub(pattern,repl,string,max=0)
a=re.sub('g.t','have','I got B,I get A,I got C',2) #所有的g.t都被替换成have,max设置替换的次数
print(a)
# subn 返回替换的总次数
a=re.subn('g.t','have','I got B,I get A,I got C') #所有的g.t都被替换成have
print(a) # 返回元组形式 ('I have B,I have A,I have C', 3) 并返回替换的总次数 text='JGood is a handsome boy,he is cool,clever,and so hearted.'
regex=re.compile(r'\w*oo\w*') #将查找的方法编译成一个对象,然后在调用findall方法,适合在多次搜寻时适用效率较高
print(regex.findall(text)) #查找所有包含oo的单词 # split 分割
p=re.compile(r'\d+')#所有十进制的数字
q=p.split('asd13fsasf32fdsfdsdfs31sdfsf12sf') #以所有的十进制数字分割字符串
print(q)#输出结果['asd', 'fsasf', 'fdsfdsdfs', 'sdfsf', 'sf']
print(re.split('[bc]','abcd')) #先用b分 再用c去分,[bc]并列的关系
#计算机其中会用到的正则表达式匹配
import re
origin='1-2*(50+100*(1+2/3)+37*(34+234+48*(45+56)))'
n=re.split('\(([^()]+)\)',origin) #在以什么分割时,在外面加上()可以把它取出来,不加只能取出分割后的东西,
#\使后面的()失去特殊意义,[]表示或的意思,里面加上^表示去否,后面加上+可以重复一到多次,不加只取一次。
print(n)
# 元字符 : . ^ $ * + ? {} [] | () \
#各种元字符都有自己的功能 # . 通配符 a=re.findall('alex.w','alexaw')# 能匹配除换行符以外的所有字符
print(a) #输出 ['alexaw'] 一个点只能匹配一个字符 # ^ 尖角符 放在规则的前面
a=re.findall('^alex','alexaw')# 加上^ 后 alex必须在最前面才能匹配到
print(a) # $ 必须放在最后才能匹配到,放在规则的后面
a=re.findall('alex$','alelexawalex')# 加上$后 alex必须在最后面才能匹配到
print(a) # * + ? {} 主要是重复
# *
a=re.findall('alex*','alelexawalexxxxxx')# 加上*后能控制*号前面的一个字符,贪婪匹配,取0到多次
# 如果要搜寻的字符串没有x 也能匹配到,当0次
# 如果想要非贪婪匹配,则可以在后面加个问号,将策略改为非贪婪,只匹配尽量少的
# 如果前后均有限定条件,则贪婪模式不起作用
a1=re.findall('alex*','alelexawale') # 输出 ['ale', 'ale']
print(a,a1) #输出 ['ale', 'alexxxxxx'] # + 重复一到多次 至少有一个
a1=re.findall('alex+','alelexawale')
print(a1) # 输出为空,因为一个x也没有 # ? 0到1次 0次或者一次
a1=re.findall('alex?','alelexawalex')
print(a1) # 输出为['ale', 'alex'] 0 次1 次都能匹配出来 #{固定次数,想几次就几次,也可以是一个区间} {3,5} 3 到 5 区间 内都能匹配到
a1=re.findall('alex{2,3}','alalexxxxawalexx')
print(a1) # 输出为['alexxx', 'alexx'] 两次 三次都能匹配出来 # () 一个括号就代表一个组
re.findall('www.(?:baidu|laonanhai).com','sdad www.laonanhai.com')
# 匹配结果为www.laonanhai.com
#如果组内前面不加?:则匹配结果为 laonanhai 因为如果不加?: 则会优先匹配组内的内容,把组内的内容显示出来
而不显示其他的内容,但如果加上?:则会取消这种优先级,结果都会匹配出来
# # \
# 反斜杠后面跟元字符 将去除元字符的特殊功能
# 反斜杠后面跟普通字符将实现特殊功能
# 引用序号对应的字组所匹配的字符串
a=re.search(r'(alex)(eric)com\2','alexericcomeric').group() #\2相当于第二组(alex)是第一组(eric)是第二组...
print(a)# 输出一个字符串 alexericcomeric alexericcom是前面匹配的 eric是第二组匹配的
# \d 匹配任何十进制数 相当于[0-9]
# \D 匹配任何非数字字符,相当于类[^0-9]
# \s 匹配任何空白字符,相当于类[\t\n\r\f\v]
# \S 匹配任何非空白字符,相当于类[^\t\n\r\f\v]
# \w 匹配任何字母数字字符,相当于类[a-zA-Z0-9]
import re
a='alex'
n=re.findall('(\w){4}',a)#匹配四次,但最后取时只取最后一个,因为就一个括号
n1=re.findall('(\w)(\w)(\w)(\w)',a)
n2=re.findall('(\w)*',a)#贪婪匹配,最后一个空也会被匹配到
n3=re.findall('',a) #默认从头开始匹配,到最后一个时x后面其实还有一个空,也会被匹配到
print(n,n1,n2,n3)#输出结果['x'] [('a', 'l', 'e', 'x')] ['x', ''] ['', '', '', '', '']
 
#  \W 匹配任何非字母数字字符,相当于类[^a-zA-Z0-9]
# \b 匹配一个单词边界,也就是指单词和空格间的位置
# \b就是在你匹配整个单词的时候,如果不是整个单词就不匹配 # 字符集 元字符 在 字符集里面是不行的 [.] . 不再是通配符的含义了
a1=re.findall('a[bc]d','alabdacdlexxxxawalexx') # [] 相当于 或 的一次 abd acd 都能匹配到
print(a1) #输出 ['abd', 'acd'] # [a-z] a-z 表示a 到 z 都能匹配到 - 就有意义了,表示至的意思
# [^a-z] ^ 表示非的意思 除了a-z 都能取出来
# [\d] 也还有意义,表示匹配任何十进制数 相当于[0-9] #原生字符串
#为了解决python 和 re 模块 有关 \ 转义之间麻烦的变换 而引进来
a1=re.findall('\\\\','abc\sad') #在re模块中'\\'两个表示取消\的特殊含义,但因为是在python环境下,'\\'只能
#代表是一个\python也有自己的转义,所以必须给它四个才能匹配成功
print(a1)# 输出结果为['\\'] 表示只有一个\
#为了解决这种麻烦,引入原生字符串
a1=re.findall(r"\\",r"abc\asd")
print(a1) #现在只需要两个\\即能匹配成功

模块

进度条例子

import sys,time
for i in range(31):
sys.stdout.write('\r') # 每一次清空原行
sys.stdout.write('%s%% |%s' % (int(i/30*100),int(i/30*100)*'*'))# 两个%可以使它成为一个真正的%
sys.stdout.flush()#强制刷新屏幕
time.sleep(0.2)

pickle

python的文件操作,如果对一个文件进行修改,如果不能修改和原来文件中相同的字节,那么新的内容将会覆盖旧的文件内容,唯一的解决办法就是重新创建一个新的文件进行读写把新的内容加进去,为了解决这个麻烦,可以用pickle模块来帮助实现

#pickle 模块
import pickle
with open('text.txt','rb') as f:
account_dic=pickle.loads(f.read())# 等于account_dic=pickle.load(f)
account_dic[1000]['balance'] -= 500
for k,v in account_dic.items():
print(k,v) with open('text.txt','wb') as f:
f.write(pickle.dumps(account_dic)) # 等于pickle.dump(account_dic,f) # json模块和pickle模块用法基本都一样,pickle比json更强大,但pickle只能在python 中使用
# 但json可以在不同语言中通用,可以在不同语言中通讯

json.loads将字符串形式的列表或者字典等,转换成真正的字典和列表,但字典或者列表中的字符串必须要双引号括住。

json.dumps将python的字典或者列表等转换成字符串

json为了通用式的数据传输,将元组dumps时,会将其变成列表,将字符串形式的元组loads时会报错,因为元组这个数据类型只有python才有,并不通用。

#本身就存在的全局变量
print(vars()) #输出结果
'''
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x000001B517D4B160>,
'__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'user.py', '__cached__': None} '''
#__doc__ .py文件的注释
#__file__.py本身自己的路径
#__package__ 当前.py文件所在的包,当从其他模块导入这个模块时,可以用这个查看这个模块所在的包是什么
#__cached__ 从其他模块导入这个模块时,当前文件为None可以用这个查看这个模块的缓存 .pyc文件
#__name__ 在当前文件时 name为 __main__,但从其他模块导入这个模块时,name将是模块名,主要是入口文件
#如果是在入口文件中调用其他的功能,加上这个 if __name__ =='__main__': 条件时,只有在入口文件.py中才会执行,
#如果是其他文件导入了这个入口文件,那么入口文件中的name将不会是main 将会是模块名,那么下面的调用将不会执行
#调用主函数前,必须加这个条件判断
if __name__ =='__main__':
print(__name__)
print('')# 只有在当前文件才会执行,如果是在其他模块中导入这个模块,那么name将不会是main,是模块名,可用模块名.__name__查看

安装第三方模块

1.安装:软件管理工具  python3中用 pip3,依赖setuptools

2源码安装:下载代码安装  先下载解压进入目录执行python setup.py install 进行安装

requests模块的作用时发送http请求的,用python来模拟网页

import requests
response=requests.get('http://wthrcdn.etouch.cn/weather_mini?city=北京')
response.encoding='utf-8'
result=response.text #result得到的是一个字符串
print(result)

XML

python 中一切皆是对象

服务器返回的请求的其中一个格式,XML格式,但这种格式前提也是字符串,python中有一个模块专门处理这种格式的数据。

#创建一个xml文件
from xml.etree import ElementTree as ET
root=ET.Element('famliy') #创建一个根节点
son=ET.Element('pp',{'kk':'vv'})#创建一个son节点,ET.Element是一个类
ele2=ET.Element('pp',{'kk':''})#创建一个ele2节点
son.append(ele2) #将ele2添加到son节点下面
root.append(son)#将son节点添加到根节点下面
tree=ET.ElementTree(root)
tree.write('first.xml',encoding='utf-8',short_empty_elements=False)#保存到first.xml文件中
#python 中一切皆对象
from xml.etree import ElementTree as ET
tree=ET.parse('first.xml')
#一切皆对象,tree就是一个对象,既然是对象那它肯定有一个归属类
print(type(tree))
#输出 <class 'xml.etree.ElementTree.ElementTree'> 属于ElementTree类,那么tree将拥有
#ElementTree类中的所有方法

xml实例

import urllib
import requests
from xml.etree import ElementTree as ET
#查询QQ在线状态 XML实例
r=requests.get('http://www.webxml.com.cn//webservices/qqOnlineWebService.asmx/qqCheckOnline?qqCode=1278628365')
result=r.text #字符串类型 # 解析XML格式内容
#XML接收一个参数:字符串,格式化为特殊的对象
node=ET.XML(result)
if node.text == 'Y':
print('在线')
else:
print('离线')
#查询火车站点 XML实例
import urllib
import requests
from xml.etree import ElementTree as ET
r = requests.get('http://www.webxml.com.cn/WebServices/TrainTimeWebService.asmx/getDetailInfoByTrainCode?TrainCode=K52&UserID=')
result = r.text # 返回的是XML格式的字符串
#解析XML格式的内容
root=ET.XML(result)#解析XML对象
for node in root.iter('TrainDetailInfo'):
print(node.find('TrainStation').text,node.find('StartTime').text)
#每一个节点都是Element类型,Element是一个类
#可以用一个类创建一个对象
#创建节点有两个方式:1,通过类创建一个节点,类比通过字符串类str()创建一个字符串
#2,通过makeelement() 单纯创建一个节点,再把节点选择挂在哪个节点的下面
from xml.etree import ElementTree as ET
#第一种方式
son=ET.Element('pp',{'kk':'vv'})#创建一个son节点,ET.Element是一个类
ele2=ET.Element('pp',{'kk':''})#创建一个ele2节点
son.append(ele2) #将ele2添加到son节点下面
root.append(son)#将son节点添加到根节点下面
#第二种方式
son=root.makeelement('tt',{'kk':'vv'})#在根节点下面创建一个son节点
s=son.makeelement('tt',{'kk':''})#在son节点下面创建一个s节点
#但第二种方式也是通过调用第一种方式来执行的

python 全栈开发笔记 3的更多相关文章

  1. python全栈开发笔记---------函数

    一 数学定义的函数与python中的函数 初中数学函数定义:一般的,在一个变化过程中,如果有两个变量x和y,并且对于x的每一个确定的值,y都有唯一确定的值与其对应,那么我们就把x称为自变量,把y称为因 ...

  2. python 全栈开发笔记 2

    函数 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发“更快更好更强...” 函数式编程最重要的是增强代码的重用性和可读性 def xx() ...

  3. python全栈开发笔记---数据类型--综合练习题

    一.有两个列表 l1 = [11,22,33]       l2 = [22,33,44] a. 获取内容相同的元素列表 for item in l1: if item in l2: print(it ...

  4. python全栈开发笔记-----------概要

    Python开发 开发: 开发语言: 高级语言:python.Java.php  .C#   .Go .ruby . C++ .... ===>字节码 低级语言:C.汇编            ...

  5. python 全栈开发笔记 4

    反射 1.通过字符串的形式导入模块 2.通过字符串的形式,去模块中寻找指定函数并执行 ''' def f1(): return 'F1' def f2(): return 'F2' ''' #假设上面 ...

  6. python 全栈开发笔记 1

    将自己的姓名用进制表示出来 #自己姓名的进制表示 name=input('请输入你的名字:') for i in name: print(i) # python 3 中是按字符进行循环的 bytes_ ...

  7. python全栈开发笔记---------字符串格式化

    字符串格式化 %s 可以接收任何值, %d只能接收整形 .其他类型报错 msg ='i am %s my body' %'ales' print(msg) #i am ales my body msg ...

  8. python全栈开发笔记---------数据类型---字典方法

    def clear(self) 清空字典里所有元素 # info = { # "k1":18, # "k2":True, # "k3":[ ...

  9. python全栈开发笔记---------数据类型-----字典dict

    字典 #dict #1.基本结构 info= { "k1" : "v1", #键值对 "k2" : "v2" } ### ...

随机推荐

  1. FJOI2019 划水记

    Day0 月考的余温尚未褪去,一周后期中考也将来临.一群被哄来打FJOI的水军,在期中大考必过前一百的死命令之下,仍然不怕死的花三天时间水同步赛.试机的路上乖乖排成两排,居然还有那么一丝春游的悠闲之感 ...

  2. Kali Linux Xfce版美化虚拟机镜像

    起因 这两天来学校把硬盘基本全部清空了,所以以前的虚拟机就需要重新安装了. Kali 一直用的是 xfce 版本,至于为什么用这个版本,是因为我感觉 gnome3 在虚拟机上表现欠佳.当然,默认的 g ...

  3. You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'group t1,customer t2

    ### SQL: select t1.gid,t1.gname,t1.gvalue,t1.gtype, t1.gaddress,t1.gmembers, t1.gcode,t1.gphone, t2. ...

  4. jmeter接口自动化测试

    一.正常单个接口 1.自定义变量设置服务器地址ip和端口 2.可以正则表达式提取取出token值设置为请求头里 如图 二.接口请求参数涉及取参(单个或多值) 提取多个值参数,用Json提取器可以直接提 ...

  5. 数据类型(data type)

    基本数据类型(primitive data type):字符型(2个字节),布尔型(一位),byte(1个字节),short(两个字节),int(4个字节),long(8个字节),float(2个字节 ...

  6. 漂亮数组 Beautiful Array

    2019-04-06 16:09:56 问题描述: 问题求解: 本题还是挺有难度的,主要是要考虑好如何去进行构造. 首先考虑到2 * A[i] = A[j] + A[k],那么j,k就必须是同奇同偶, ...

  7. MySQL 8.0.12 基于Windows 安装教程(超级详细)

    MySQL 8.0.12 基于Windows 安装教程(超级详细) (一步一步来,装不了你找我!) 本教程仅适用Windows系统,如果你原本装了没装上,一定要先删除原本的数据库,执行:mysqld ...

  8. 从身份证管理系统思考企业CMDB的建设

    关注嘉为科技,获取运维新知 对大部分中大型的企业来说,CMDB建设对于整个IT服务和IT运维管理的重要性不言而喻,但是目前仍然有非常多的企业无法建设好CMDB. 我最近刚好接触了一个公安系统的朋友,他 ...

  9. linux shell 脚本 svn自动更新项目并且打包 、发布、备份

    这里先准备一个配置文件,用于保存svn地址.目的路径.用户名跟密码 配置文件名问:toolConfig.properties #svn地址 svnAddress=https://192.168.1.2 ...

  10. 撸一个小型PHP框架

    项目地址:https://packagist.org/packages/cshaptx4869/frame # 开发中... ## 20190410 注解路由 ## 20190411 依赖注入 容器I ...