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 python
 
def 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  hashlib
 
hash = hashlib.md5()
hash.update(bytes('admin',encoding='utf-8'))
print(hash.hexdigest())
print(hash.digest())
 
#结果:
21232f297a57a5a743894a0e4a801fc3
b'!#/)zW\xa5\xa7C\x89J\x0eJ\x80\x1f\xc3'

以上加密算法虽然依然非常厉害,但存在缺陷,即:通过撞库可以反解,所以有必要对加密算法中添加自定义key做二次加密。

1
2
3
4
5
6
7
8
9
import hashlib
 
 
hash = 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 re
str='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 re
 
str='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 re
 
str='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模块的更多相关文章

  1. 十八. Python基础(18)常用模块

    十八. Python基础(18)常用模块 1 ● 常用模块及其用途 collections模块: 一些扩展的数据类型→Counter, deque, defaultdict, namedtuple, ...

  2. Python基础-包与模块

    Python基础-包与模块 写在前面 如非特别说明,下文均基于Python3 摘要 为重用以及更好的维护代码,Python使用了模块与包:一个Python文件就是一个模块,包是组织模块的特殊目录(包含 ...

  3. python基础,函数,面向对象,模块练习

    ---恢复内容开始--- python基础,函数,面向对象,模块练习 1,简述python中基本数据类型中表示False的数据有哪些? #  [] {} () None 0 2,位和字节的关系? # ...

  4. python基础31[常用模块介绍]

    python基础31[常用模块介绍]   python除了关键字(keywords)和内置的类型和函数(builtins),更多的功能是通过libraries(即modules)来提供的. 常用的li ...

  5. python基础-包和模块

    Python基础-包与模块 写在前面 如非特别说明,下文均基于Python3 摘要 为重用以及更好的维护代码,Python使用了模块与包:一个Python文件就是一个模块,包是组织模块的特殊目录(包含 ...

  6. Python全栈开发之路 【第六篇】:Python基础之常用模块

    本节内容 模块分类: 好处: 标准库: help("modules") 查看所有python自带模块列表 第三方开源模块: 自定义模块: 模块调用: import module f ...

  7. Python基础之re模块

    什么是模块? 为了编写可维护的代码,我们把很多的函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很多编程语言都采用这种组织代码的方式,在Python中,一个.py文件就称为一个模块 ...

  8. 【笔记】Python基础六:模块module介绍及常用模块

    一,module模块和包的介绍 1,在Python中,一个.py文件就称之为一个模块(Module). 2,使用模块的好处? 最大的好处是大大提高了代码的可维护性 其次,编写代码不必从零开始,我们编写 ...

  9. Python基础入门-os模块

    今天我们来介绍一下os模块中常用的一些方法,当然python中的os模块中提供的使用方法有很多,但是这里面小编会列举出来一些和实际工作中应用的相关的方法,而且会有一些实际的例子方便大家对os模块理解. ...

  10. python基础,导入模块,if语句,while语句

    python基础 python代码 变为字节码 变为机器码 最后执行执行‘文件名.py’文件时出现的‘文件名.pyc’文件为字节码 缓存机制 使用pycharm的时候在文件最开始添加下面这两行代码,中 ...

随机推荐

  1. ssh 公钥登录远程主机 并禁止密码登录

    https://www.digitalocean.com/community/tutorials/how-to-set-up-ssh-keys-on-centos7 如果在新的机器上,得先用密码登录一 ...

  2. Oracle11.2.0.1升级到11.2.0.3

    Oracle数据库升级也并非简单的事,这篇博客,博主对Oracle那点事做了较详细的介绍: http://blog.itpub.net/9599/viewspace-473003/ 我还属于Oracl ...

  3. 图的遍历---------开始开始-------o(∩_∩)o 哈哈

    图的遍历 深度优先搜索(Depth First Search , DFS) --深度优先搜索--我的理解就是分身术的另一种实现方法---用分身术将所有能看到的路都走一遍----这就是深度搜索--- 下 ...

  4. ubu下编译安装php7

    第一步: 安装依赖库zlib.libpng.freetype.jpegsrc.libxml2.libgd.freetds.mhash.libmcrypt.mcrypt(依赖于mhash和libmcry ...

  5. hdu3436Queue-jumpers(线段树)

    链接 这题最不好求的一部分是rank部分 因为top每次都是把一个数放在队头 不会穿插在数组里 也就是说后面没有top过的一部分数 依旧保持有序 这样可以分为两部分来处理 比如 1 2 3 4 5 6 ...

  6. [转]无废话SharePoint入门教程二[SharePoint发展、工具及术语]

    本文转自:http://www.cnblogs.com/iamlilinfeng/p/3186919.html 一.前言 1.由于上一篇文章的标题命名失误,此篇标题写给百度搜索”什么是SharePoi ...

  7. WPF学习07:MVVM 预备知识之数据绑定

    MVVM是一种模式,而WPF的数据绑定机制是一种WPF内建的功能集,两者是不相关的. 但是,借助WPF各种内建功能集,如数据绑定.命令.数据模板,我们可以高效的在WPF上实现MVVM.因此,我们需要对 ...

  8. 关于表单清空的细节(reset函数或者class="reset"属性)

    在需要清空的表单的情况下, 如果是在页面中 那么就添加属性 class="reset"  也即是 <button class="reset" value= ...

  9. (六)SpringIoc之延时加载

    Spring容器初始化时将所有scope = singleton的bean进行实例化. 通常情况下这是一件好事,因为这样在配置中的错误会更容易发现.但是如果不想spring容器初始化就实例化就要用到延 ...

  10. [BZOJ2005][NOI2010]能量采集 数学

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2005 发现与$(0,0)$连线斜率相同的点会被挡住.也就是对于$(a,b)$且$gcd(a ...