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 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_-]+)+

时间: 2024-12-22 23:54:37

Python基础(十)re模块的相关文章

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

python基础31[常用模块介绍] python除了关键字(keywords)和内置的类型和函数(builtins),更多的功能是通过libraries(即modules)来提供的. 常用的libraries(modules)如下: 1)python运行时服务 * copy: copy模块提供了对复合(compound)对象(list,tuple,dict,custom class)进行浅拷贝和深拷贝的功能. * pickle: pickle模块被用来序列化python的对象到bytes流,从

Python 基础之re 模块

Python 基础之大话 re 在使用re模块中主要会用到一下几个方法: re.match() #从头匹配一个字符串 re.search() #浏览全部字符串,匹配第一个符合规则的字符串 re.findall() #将匹配到的所有内容都放在一个列表中 #re.finditer() re.split() re.sub() 好,先简单的介绍一下re 模块中的基础知识: 1.元字符 . ^ $ * + ? {} []  | () \  , 2.\的功能:         #1.反斜杠后面跟元字符去除特

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

python基础 python代码 变为字节码 变为机器码 最后执行执行'文件名.py'文件时出现的'文件名.pyc'文件为字节码 缓存机制 使用pycharm的时候在文件最开始添加下面这两行代码,中文部分为解释#!/user/bin/env python 用执行下面的命令#-*- coding:utf-8 -*- 使用的编码为UTF-8 为了不每次编写文件的时候都需要添加这两行代码,我们可以在pycharm中设置py文件的基础代码,就是创建py文件就会生成的代码 链接 import lib #

Python基础5-常用模块

本节大纲 模块介绍 time &datetime模块 random os sys shutil shelve xml处理 yaml处理 configparser hashlib subprocess logging模块 re正则表达式 模块,就是实现某种或者某类功能代码的合集. 类似于函数式编程和面向过程编程,函数式编程完成一个功能,其他代码可以调用,提供了代码的重用性跟代码间的耦合.对于一个复杂的功能,可能需要多个函数才能完成,多个.py文件的代码集合就叫做模块. 如:os是系统相关的模块:f

2015/9/15 Python基础(12):模块和包

模块是用来组织 Python 代码的方法,而包则是用来组织模块的. 当代码量很大时,我们一般会把代码分成几个有组织的代码段,然后每个代码段之间有一定的联系.代码单之间是共享的,所以Python允许调入一个模块,允许使用其他模块的属性利用之前的工作成果,实现代码重用.那些自我包含并且有组织的代码片段就是模块(module),将其他模块中属性附加到你的模块中的操作较导入(import) 模块是逻辑上的说法,而它们在物理层是一个个独立的文件,模块的文件名就是模块的名字加拓展名.py.与其他可以导入类的

[Python基础]009.os模块(1)

os模块(1) 介绍 os 常量 文件目录操作 文件属性操作 遍历文件夹 介绍 os模块是系统服务应用程序接口,是Python最常用的模块之一. os模块包含了对文件和文件夹的操作,操作系统相关的操作等. 以及os.path模块,主要处理路径操作. os 常量 os.linesep 换行符,Unix为 \n ,Win32为 \r\n os.sep 文件路径分隔符,Unix为 /,Win32为 \ os.pathsep 多个文件路径间的分隔符,Unix为 :,Win32为 ; os.curdir

Day5 - Python基础5 常用模块学习

Python 之路 Day5 - 常用模块学习 本节大纲: 模块介绍 time &datetime模块 random os sys shutil json & picle shelve xml处理 yaml处理 configparser hashlib subprocess logging模块 re正则表达式 模块,用一砣代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来,

python基础11 ---函数模块1

函数模块 一.函数模块的作用(为什么要有函数模块) 1.函数模块可以减少代码量 2.函数模块方便阅读 3.函数模块维护性强二.函数模块的本质以及调用方法 1.函数模块的本质就是一个.py结尾的文件,该文件内写入大量函数 2.必须用import来引用函数模块,在调用函数模块时必须以"模块名.函数名"来调用函数模块中的函数. 3.有的时候我们只需要用到模块中的某个函数,也可以用"from 模块名 improt 函数1,函数2"的方式来引用该模块,但只是一次引用,不建议使

python基础14 ---函数模块5(模块和包)

模块与包 一.模块 1.模块是怎么诞生的. 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护.为了编写可维护的代码,我们把很多函数分组,分别放到 不同的文件里,这样,每个文件包含的代码就相对较少,很多编程语言都采用这种组织代码的方式.在Python中,一个.py文件就称之为一个模块(Module). 2.模块的作用. 提高了代码的可维护性.其次是编写代码不必从零开始.当一个模块编写完毕,就可以被其他地方引用.我们在编写程序的时候,也经常引用其他模块,

python基础五:模块

模块&包 模块(Module)的概念:在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里的代码会越来越长,维护也越来越不易.为了编写可维护的代码,我们把很多函数分组,分别放在不同的文件里,很多语言都采用这个组织代码的方式,在python中一个.py文件就称之为模块.使用模块的好处:大大提高代码的可维护性.其次,编写代码不必从零开始.当一个模块编写完毕,就可以被其他地方引用.我们在编写程序的时候,也经常引用其他模块,包括Python内置的模块和来自第三方的模块. 所以,模块一共三种: p