Python基础(十)re模块
Python基础阶段快到一段落,下面会陆续来介绍python面向对象的编程,今天主要是补充几个知识点,下面开始今天的内容。
一、反射
反射的作用就是列出对象的所有属性和方法,反射就是告诉我们,这个对象到底是什么,提供了什么功能,
可以伪造Web框架的路由系统。
举个例子:
|
1
2
|
>>> dir(json)['JSONDecodeError', 'JSONDecoder', 'JSONEncoder', '__all__', '__author__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__', '__version__', '_default_decoder', '_default_encoder', 'decoder', 'dump', 'dumps', 'encoder', 'load', 'loads', 'scanner'] |
如上所看,dir是一个内置的反射函数,可以列出对象的属性和方法。那么看一下有哪些反射内置函数
dir([obj]): 调用这个方法将返回包含obj大多数属性名的列表(会有一些特殊的属性不包含在内),obj的默认值是当前的模块对象
hasattr(obj,attr): 这个方法用于检查obj是否有一个名为attr的值的属性,返回一个布尔值。
getattr(obj,attr): 调用这个方法将返回obj中名为attr值的属性的值,例如如果attr为'bar'则返回obj.bar.
setattr(obj,attr,val): 调用这个方法给obj的名为attr的值的属赋值为val,例如如果attr为'bar',则相当于obj.bar=val
下面举个例子来把上面的内置函数应用到实际环境中:
|
1
2
3
4
5
6
7
8
9
10
|
#!/usr/bin/env pythondef login(): print('欢迎登录')def out(): print('exit....')def home(): print('你好') |
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
import commands #引用上面的自定义模块def run(): inp=input('请输入访问的URL:') m,f = inp.split('/') #输入时的格式为commands/方法 obj=__import__(m) #获取用户输入的模块名,通过__import__(字符串)导入模块 if hasattr(obj,f): #判断模块里有没有输入方法 func = getattr(obj,f) #如果模块里有这个方法,获取模块里的方法 func() else: print('\033[31;1m404\033[0m')if __name__='__main__': run() |
从上面的脚本里可以看到有一些想这种__import__、__name__、__main__的函数,下面我们来介绍一下这种函数:
__name__: 只有执行当前文件时,当前文件的特殊变量__name__=='__main__'才会生效,一般这个函数用到主函数中;
__file__: 当前py文件所在相对路径,要和os.path.abs()配合使用;
__cached__: 字节码存放位置pyc文件;
__import__(字符串): 可以通过__import__()函数导入模块;
__dic__: 获取程序注释
__package__:模块在包里面
二、hashlib加密模块
用于加密相关的操作,代替了md5和sha模块,主要提供SHA1、SHA224、SHA256、SHA384、SHA512、MD5算法。这里只介绍md5加密,下面请看例子:
|
1
2
3
4
5
6
7
8
9
10
|
import hashlibhash = hashlib.md5()hash.update(bytes('admin',encoding='utf-8'))print(hash.hexdigest())print(hash.digest())#结果:21232f297a57a5a743894a0e4a801fc3b'!#/)zW\xa5\xa7C\x89J\x0eJ\x80\x1f\xc3' |
以上加密算法虽然依然非常厉害,但存在缺陷,即:通过撞库可以反解,所以有必要对加密算法中添加自定义key做二次加密。
|
1
2
3
4
5
6
7
8
9
|
import hashlibhash = hashlib.md5(bytes('898oaFs09f',encoding='utf-8'))hash.update(bytes('admin',encoding='utf-8')) #对admin字符进行md5加密print(hash.hexdigest())#结果:67929daefab29024d18340945036e291 |
三、re模块
python中re模块提供了正则表达式相关操作。
1、 字符串匹配:
. 匹配除换行符以外的任意字符
\w 匹配字符或数字或下划线或汉字
\s 匹配任意空白字符
\d 匹配数字
\b 匹配单词的开始或结束
^ 匹配字符串的开始
$ 匹配字符串的结束
2、字符串次数匹配:
* 重复0次或多次
+ 重复1次或多次
? 重复0次或1次
{n} 重复n次
{n,} 重复n次或更多次
{n,m} 重复n到m次
3、re模块的方法
方法一:match
match:从起始位置开始匹配,匹配成功返回一个对象,未匹配成功返回None.
|
1
2
3
4
|
#格式:re.match(pattern,string,flags=0)# pattern: 正则模型 # string:要匹配的字符串 # flags:匹配模式 |
举例说明:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
#无分组import re str='hello,jack123' r=re.match('h\w+',str)print(r.group()) #获取匹配到的所有结果print(r.groups()) #获取模型中匹配到的分组结果print(r.groupdict()) #匹配模型中匹配到的分组结果 #结果:hello #有分组#分组:为了提取匹配成功的指定内容(先匹配成功全部正则,然后再将匹配成功的局部内容提取出来) r1=re.match('h(?P<name>\w+).*k(\d+)',str)print(r1.group()) #获取匹配到的所有结果print(r1.groups()) #获取模型中匹配到的分组结果print(r1.groupdict()) #获取模型中匹配到的分组中所有 执行了key的组 #结果:hello,jack123('ello', '123'){'name': 'ello'} |
方法二:search
search: 浏览整个字符串去匹配第一个,为匹配成功返回None,这里强调一下match方法是从开头去匹配。
格式: search(pattern,string,flags=0)
举例说明:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
import restr='123hello,jack123'#无分组r=re.search('h\w+',str)print(r.group()) #获取匹配到的所有结果print(r.groups()) #获取模型中匹配到的分组结果print(r.groupdict()) #获取模型中匹配到的分组结果#结果:hello(){}#有分组r=re.search('h(?P<name>\w+).*k(?P<age>\d+)',str)print(r.group()) #获取匹配到的所有结果print(r.groups()) # 获取模型中匹配到的分组结果print(r.groupdict()) # 获取模型中匹配到的分组中所有执行了key的组#结果:hello,jack123('ello', '123'){'age': '123', 'name': 'ello'} |
方法三:findall
findall:获取非重复的匹配列表;如果有一个组则以列表形式返回,且每一个匹配均是字符串;如果模型中多个组,则以列表形式返回,且每一个匹配均是元组;空的匹配也会包含在结果中。
格式:findall(pattern,string,flags=0)
举例说明:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
import restr='123hello,jack123'#无分组r = re.findall('h\w+',str)print(r)#结果:['hello']#有分组r1= re.findall('h(\w+)',str)print(r1)#结果:['ello'] |
方法四:sub
sub:替换匹配成功的指定位置的字符串
|
1
2
3
4
5
6
|
#格式:sub(pattern,repl,string,count=0,flags=0)#pattern:正则模型#repl :要替换的字符串或可执行对象#string :要匹配的字符串#count :指定匹配个数#flags :匹配模式 |
举例说明:
|
1
2
3
4
5
6
7
8
|
import re str='123hello,jack123hello'r=re.sub("h\w+",'456',str,1) #将字符串hello替换成456,后面这个flags=1是匹配到结果后,如果是多个只替换一个,默认是全部替换print(r)#结果:123456,jack123hello |
方法五:split
split:根据正则匹配分割字符串
|
1
2
3
4
5
|
#格式:split(pattern, string, maxsplit=0, flags=0)# pattern: 正则模型# string : 要匹配的字符串# maxsplit:指定分割个数# flags : 匹配模式 |
举例说明:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
import restr='123hello,jack123hello'#无分组r=re.split('hello',str,1)print(r)#结果:['123', ',jack123hello']#有分组r1=re.split('(hello)',str,1)print(r1)r2=re.split('(h(ell)o)',str,1) #可以通过括号多切分几层,取到自己满意的结果为止print(r2)#结果:['123', 'hello', ',jack123hello']['123', 'hello', 'ell', ',jack123hello'] |
|
1
2
3
4
5
6
7
|
inpp = '1-2*((60-30 +(-40-5)*(9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2))'inpp = re.sub('\s*','',inpp) #将空格替换成空new_content = re.split('\(([\+\-\*\/]?\d+[\+\-\*\/]?\d+){1}\)', inpp, 1)print new_content#结果:['1-2*((60-30+', '-40-5', '*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))'] |
练习:
1、拼接IP地址:
|
1
|
^(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}$ |
2、拼接手机号:
|
1
|
^1[3|4|5|8][0-9]\d{8}$ |
3、拼接邮箱地址:
|
1
|
[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+ |
Python基础(十)re模块的更多相关文章
- 十八. Python基础(18)常用模块
十八. Python基础(18)常用模块 1 ● 常用模块及其用途 collections模块: 一些扩展的数据类型→Counter, deque, defaultdict, namedtuple, ...
- Python基础-包与模块
Python基础-包与模块 写在前面 如非特别说明,下文均基于Python3 摘要 为重用以及更好的维护代码,Python使用了模块与包:一个Python文件就是一个模块,包是组织模块的特殊目录(包含 ...
- python基础,函数,面向对象,模块练习
---恢复内容开始--- python基础,函数,面向对象,模块练习 1,简述python中基本数据类型中表示False的数据有哪些? # [] {} () None 0 2,位和字节的关系? # ...
- python基础31[常用模块介绍]
python基础31[常用模块介绍] python除了关键字(keywords)和内置的类型和函数(builtins),更多的功能是通过libraries(即modules)来提供的. 常用的li ...
- python基础-包和模块
Python基础-包与模块 写在前面 如非特别说明,下文均基于Python3 摘要 为重用以及更好的维护代码,Python使用了模块与包:一个Python文件就是一个模块,包是组织模块的特殊目录(包含 ...
- Python全栈开发之路 【第六篇】:Python基础之常用模块
本节内容 模块分类: 好处: 标准库: help("modules") 查看所有python自带模块列表 第三方开源模块: 自定义模块: 模块调用: import module f ...
- Python基础之re模块
什么是模块? 为了编写可维护的代码,我们把很多的函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很多编程语言都采用这种组织代码的方式,在Python中,一个.py文件就称为一个模块 ...
- 【笔记】Python基础六:模块module介绍及常用模块
一,module模块和包的介绍 1,在Python中,一个.py文件就称之为一个模块(Module). 2,使用模块的好处? 最大的好处是大大提高了代码的可维护性 其次,编写代码不必从零开始,我们编写 ...
- Python基础入门-os模块
今天我们来介绍一下os模块中常用的一些方法,当然python中的os模块中提供的使用方法有很多,但是这里面小编会列举出来一些和实际工作中应用的相关的方法,而且会有一些实际的例子方便大家对os模块理解. ...
- python基础,导入模块,if语句,while语句
python基础 python代码 变为字节码 变为机器码 最后执行执行‘文件名.py’文件时出现的‘文件名.pyc’文件为字节码 缓存机制 使用pycharm的时候在文件最开始添加下面这两行代码,中 ...
随机推荐
- java启动参数一
java启动参数共分为三类: 其一是标准参数(-),所有的JVM实现都必须实现这些参数的功能,而且向后兼容: 其二是非标准参数(-X),默认jvm实现这些参数的功能,但是并不保证所有jvm实现都满足, ...
- Django MTV模型思想
一.Django的MTV分别代表: 1.Model(模型):负责业务对象与数据库的对象(ORM) 2.Template(模版):负责如何把页面展示给用户 3.View(视图):负责业务逻辑,并在适当的 ...
- 递推DP UVA 473 Raucous Rockers
题目传送门 题意:n首个按照给定顺序存在m张光盘里,每首歌有播放时间ti,并且只能完整的存在一张光盘里,问最多能存几首歌 分析:类似01背包和完全背包,每首歌可存可不存,存到下一张光盘的情况是当前存不 ...
- 421 Maximum XOR of Two Numbers in an Array 数组中两个数的最大异或值
给定一个非空数组,数组中元素为 a0, a1, a2, … , an-1,其中 0 ≤ ai < 231 .找到 ai 和aj 最大的异或 (XOR) 运算结果,其中0 ≤ i, j < ...
- ADO.net增删改的使用
添加数据 -------------------------------------------------- //让用户输入要添加的内容 Console.WriteLine("请输入要添加 ...
- jvm 脑图
- php中字符与字节的区别
字符: 字符是可使用多种不同字符方案或代码页来表示的抽象实体.例如,Unicode UTF-16 编码将字符表示为 16 位整数序列,而 Unicode UTF-8 编码则将相同的字符表示为 8 位字 ...
- [小记]Android缓存问题
今天晚上,产品经理打电话说我们的Android App除了问题,问题很简单就是一个缓存问题,由于这个程序是前同事写的,我也只能呵呵一笑,有些事你就得扛.还是回到正题吧,这个缓存问题,实在有点奇葩,所以 ...
- .Net Mvc EasyUI DataGrid 分页
由于项目的需要,最近一直在学习 .net MVC 和EasyUI.上周写了一个<.Net Mvc 返回Json,动态生成EasyUI Tree>,今天再写一个EasyUI中另一个重要的组件 ...
- Android(java)学习笔记195:ContentProvider使用之添加数据到联系人(掌握)
1.添加联系人逻辑思路 (1)首先在raw_contacts创建一个新的id (2)在data表里面添加这个id对应的数据 2.下面通过一个案例,说明一下如何添加一条数据到联系人: (1)首先我们关注 ...