Python之反射,正则
本节主要内容:
一. 反射:
getattr
hasattr
setattr
defattr
二. 补充模块中特殊的变量
三. 正则表达式
re模块
(一)反射:
- hasattr(object, name) 检查
- getattr(object, name) 寻找
- setattr(object, name, value) 设置
- delattr(object, name) 删除
说明:判断对象object是否包含名为name的特性(hasattr是通过调用getattr(ojbect, name)是否抛出异常来实现的)。
参数object:对象。
参数name:特性名称。
#利用字符串的形式去对象(模块)中操作(寻找,检查,设置,删除)成员。
例子:
#模拟网站不同url访问不同页面 ##commons.py def login():
print("登陆页面") def logout():
print("退出页面") def home():
print("主页面") ##index import commons #利用字符串的形式去对象(模块)中操作(寻找)成员。
def run():
inp = input("请输入要访问的页面:") if hasattr(commons,inp):
func = getattr(commons,inp)
func()
else:
print("") if __name__ == '__main__':
run() #输出: 请输入要访问的页面:login
登陆页面
请输入要访问的页面:home
主页面
请输入要访问的页面:fsdfsf
404
##模块实现反射
##index.py def run():
#account/login
inp = input("请输入要访问的url:") m, f = inp.split('/') #m为模块,f模块中函数,中间用/分隔
obj = __import__(m)
if hasattr(obj, f):
func = getattr(obj, f)
func()
else:
print("")
if __name__ == '__main__':
run() ##account.py def login():
print("登陆页面") def logout():
print("退出页面") ##manager.py def order():
print("订单页面") #输出: 请输入要访问的url:account/login
登陆页面
请输入要访问的url:manager/order
订单页面
请输入要访问的url:account/sfdsdf
404
##模块多层目录时,可使用fromlist = True
##lib/test/account.py #多层级目录
m, f = inp.split('/')
obj = __import__("lib." + m ,fromlist = True)
#目录加.(点),后+模块,fromlist = True
( 二) 补充模块中特殊的变量
__doc__: 显示注释信息
__cached__: pyc文件路径
__file__: 当前py文件所在路径
os.path.dirname: 找到某个文件的上级目录
os.path.abspath: 获取某个文件的绝对路径
import os,sys #sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) print(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) #输出: D:\python程序\s13\day6\模块 #输出file绝对路径的上级目录的上级目录
#注: 一般可执行文件都需要加入。
__package__: 查找模块在哪个目录,当前目录使用返回None
__name__:
如果我们是直接执行某个.py文件的时候,该文件中那么”__name__ == '__main__'“是True,但是我们如果从另外一个.py文件通过import导入该文件的时候,这时__name__的值就是我们这个py文件的名字而不是__main__。
这个功能还有一个用处:调试代码的时候,在”if __name__ == '__main__'“中加入一些我们的调试代码,我们可以让外部模块调用的时候不执行我们的调试代码,但是如果我们想排查问题的时候,直接执行该模块文件,调试代码能够正常运行!
hashlib : 用于加密相关的操作,代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法.
import hashlib
obj = hashlib.md5(bytes('3454abdFdf', encoding='utf-8'))
obj.update(bytes('admin',encoding='utf-8'))
print(obj.hexdigest())
三. 正则表达式(re)
正则表达式(re)是由一些字符和特殊符号组成的字符串,通过某个模式匹配到有相似特征的字符串,可以是单个也可以是多个。
正则表达式使用的特殊符合和字符





re模块:
最常用的几个方法:
compile(pattern,flages=0): 对正则表达式模式pattern进行编译,flags为可选标志符,并返回一个regex对象
match(pattern,string, flages=0) : 尝试用正则表达式模式pattern匹配字符串string,flages可选标志符,如果匹配成功返回匹配对象,否则返回None.
search(pattern,string, flages=0) : 在字符串string中查找正则表达式模式pattern的第一次出现,匹配成功,返回匹配对象,否则为None。
findall(pattern,string[,flages]): 在字符串string中查找正则表达式模式pattern的所有(非重复)出现: 返回一个匹配对象的列表。
finditer(pattern,string[,flages]): 和findall相同,但返回的是一个迭代器而不是一个列表,对于每个匹配,该迭代器返回一个匹配对象。
split(pattern,string, max=0): 根据正则表达式pattern中的分隔符把字符string分割为一个列表,返回成功匹配的列表,最多分割max次(默认分割所有匹配过的地方)
sub(pattern, repl, string, max=0) : 把字符串string中所有匹配正则表达式pattern的地方替换成字符串repl,如果max的值没有给出,默认对所有匹配到的地方进行替换。与sub相同的subn()则会返回一个表示替换次数的数值。
group(num=0) : 返回所有匹配对象(或指定编号是num的子组)
groups() : 返回一个包含全部匹配的子组的元组(如果没有成功匹配,则返回一个空的元组)
###match(): 匹配字符串
#####match#####
import re
m = re.match('foo','foo') #模式匹配字符串
if m is not None: #如果不为None,则成功显示foo
print(m.group())
print(m) #返回一个匹配对象的实例。
#虽然定义字符串长,但是匹配是从开头匹配,成功则返回。否则报错。
m1 = re.match('foo','food on the table').group()
print(m1)
#输出:
foo
<_sre.SRE_Match object; span=(0, 3), match='foo'>
foo
###search() : 在一个字符串中查找一个模式
#####search#####
m = re.match('foo','seafood').group()#匹配不到会抛出异常
print(m)
m = re.search('foo', 'seafood').group()#可以匹配任意位置
print(m)
输出:
AttributeError: 'NoneType' object has no attribute 'group'
foo
###findall():找到每个出现的匹配部分
#####findall#####
print(re.findall('car','car'))
print(re.findall('car','mycar'))
print(re.findall('car','carry the barcardi to the car'))
#输出:
['car']
['car']
['car', 'car', 'car']
注意 :
findall()与search()相同的是二者都可在任意位置执行字符串搜索,findall()与search(),match()不同之处,findall()总返回一个列表,没有匹配则返回空列表,匹配到,返回所有匹配部分(从左到右)。
###sub()[subn()]: 进行搜索和替换
#####sub,subn#####
print(re.sub('hongfei','zhaohongfei', 'My name is hongfei'))
#匹配到hongfei并替换为zhaohongfei
print(re.subn('hongfei','zhaohongfei', 'My name is hongfei'))
#与sub相同,但是返回一个元组,并记录匹配次数
print(re.sub('[abc]','ABC','gtdacf'))#多个元素匹配
print(re.subn('[abc]','ABC','gtdacf'))
#输出:
My name is zhaohongfei
('My name is zhaohongfei', 1)
gtdABCABCf
('gtdABCABCf', 2)
###split(): 分割
#####split()#####
print(re.split(':','zhao:hong:fei')) #以分号分割字符串
print(re.split(':','zhao:hongfei'))
#输出:
['zhao', 'hong', 'fei']
['zhao', 'hongfei']
###group(), groups()
#####group, groups##### import re ###group
a = "123abc456"
print(re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(0)) #123abc456,返回整体
print(re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(1)) #
print(re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(2)) #abc
print(re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(3)) # ###gorups #都是返回整体
print(re.search("([0-9]*)([a-z]*)([0-9]*)",a).groups(0))
print(re.search("([0-9]*)([a-z]*)([0-9]*)",a).groups(1))
print(re.search("([0-9]*)([a-z]*)([0-9]*)",a).groups(2))
print(re.search("([0-9]*)([a-z]*)([0-9]*)",a).groups(3)) #输出: 123abc456
123
abc
456 ('', 'abc', '') #由此可以看到groups为返回匹配的整体
('', 'abc', '')
('', 'abc', '')
('', 'abc', '')
1. 正则表达式中的三组括号把匹配结果分成三组
- group() 同group(0)就是匹配正则表达式整体结果
- group(1) 列出第一个括号匹配部分,group(2) 列出第二个括号匹配部分,group(3) 列出第三个括号匹配部分。
2. 没有匹配成功的,re.search()返回None
3. groups为返回匹配到的整体的一个元组。
以上为所学内容总结,后续会继续完善,谢谢!
Python之反射,正则的更多相关文章
- python浅谈正则的常用方法
python浅谈正则的常用方法覆盖范围70%以上 上一次很多朋友写文字屏蔽说到要用正则表达,其实不是我不想用(我正则用得不是很多,看过我之前爬虫的都知道,我直接用BeautifulSoup的网页标签去 ...
- python匹配ip正则
python匹配ip正则 #!/usr/bin/env python # -*- coding:utf-8 -*- import re ip_str = "asdad1.1.1.1sdfwe ...
- python的反射机制
转载自:http://www.cnblogs.com/feixuelove1009/p/5576206.html 对编程语言比较熟悉的朋友,应该知道"反射"这个机制.Python作 ...
- python的反射
目前大多数网站都是通过路由的方法来,处理url请求,如果有很多个url的话,不停的include或者用if判断匹配,似乎不太符合情理,因此这里讲讲python的反射机制, 自动装在模块.请看下面的实例 ...
- 简单谈谈python的反射机制
转:http://www.jb51.net/article/87479.htm 本文主要介绍python中的反射,以及该机制的简单应用,熟悉JAVA的程序员,一定经常和Class.forName打交道 ...
- 【归纳】正则表达式及Python中的正则库
正则表达式 正则表达式30分钟入门教程 runoob正则式教程 正则表达式练习题集(附答案) 元字符\b代表单词的分界处,在英文中指空格,标点符号或换行 例子:\bhi\b可以用来匹配hi这个单词,且 ...
- 【转】简单谈谈python的反射机制
[转]简单谈谈python的反射机制 对编程语言比较熟悉的朋友,应该知道“反射”这个机制.Python作为一门动态语言,当然不会缺少这一重要功能.然而,在网络上却很少见到有详细或者深刻的剖析论文.下面 ...
- python 爬虫之 正则的一些小例子
什么是正则表达式 正则表达式是对字符串操作的一种逻辑公式,就是 事先定义好的一些特定字符.及这些特定字符的组合,组成一个“规则字符”,这个“规则字符” 来表达对字符的一种过滤逻辑. 正则并不是pyth ...
- Python实例---利用正则实现计算器[FTL版]
import re # 格式化 def format_str(str): str = str.replace('--', '+') str = str.replace('-+', '-') str = ...
- Python中的正则
regex_lst = [ ('字符组',), ('非打印字符',), ('特殊字符',), ('定位符',), ('限定符',), ('re模块',), ('分组命名',), ('或匹配',), ( ...
随机推荐
- iframe多层嵌套时获取元素总结
父页面获取子页面元素: 注意:onload事件 jQuery获取: $("iframe").contents().find("holder")......; ( ...
- 微信小程序之页面路由(九)
[未经允许,请勿以任何形式转载] 什么是路由? 我们通常理解的路由指分组数据包从源到目的地时,决定端到端路径的网络范围的进程: 借用上面的定义,我们可以理解小程序页面路由,根据路由规则(路径)从一个页 ...
- 2016-2017-2 《Java程序设计》教学进程
2016-2017-2 <Java程序设计>教学进程 目录 考核方式 课前准备 教学进程 第00周学习任务和要求 第01周学习任务和要求 第02周学习任务和要求 第03周学习任务和要求 第 ...
- iOS——学习网址收集+如何提高iOS开发技能
1 一个比系统自带的终端好用的软件:http://www.iterm2.com 2 学习和遇到技术问题可以去的网站: CocoaChina http://developer.cocoachi ...
- 利用python将二值csv格式转换为矩阵
#!/usr/bin/env python # coding:utf-8 #import pandas as pd, numpy as np; ''' 将csv文件转换为对应的邻接矩阵mat ''' ...
- 微信小程序之ES6与事项助手
由于官方IDE更新到了0.11.112301版本,移除了对Promise的支持,造成事项助手不能正常运行,解决此问题,在项目中引入第三方兼容库Bluebird支持Promise,代码已经整合到项目代码 ...
- Uncaught Error: Bootstrap tooltips require Tether (http://github.hubspot.com/tether/)
引用bootstrap之后报这个错误,错误出在bootstrap.js文件中,原语句是: if(void 0===window.Tether) throw new Error("Bootst ...
- 使用jquery脚本获取随笔、文章和评论的统计数,自定义显示位置
为了这个问题,花了好些时间去摸索,无奈没有搞定.于是,我就到博问去提问,终于搞定! 在此,非常感谢SeayXu的热心帮助. 1.在需要的位置添加一个标签 <div id="stats_ ...
- C#汉字转拼音帮助类
using System; using System.Collections.Generic; using System.Text; using System.Text.RegularExpressi ...
- 【转】ubuntu vpn自动切换路由
需要的工作有以下三項 Ubuntu Network Manager Client (nmcli)用來建立VPN連線的工具其實在UBUNTU在桌面上就有VPN連線可以用, 為什麼我們還要這麼大費周章的用 ...