容器:如列表、元组、字符串、字典等,这些都是对数据的封装。
函数:对语句的封装。
类:对方法和属性的封装,即对函数和数据的封装。
模块:模块就是程序,也就是平时写的任何代码,保存的每一个.py文件都是一个程序,一个模块。
一、 模块的导入
- import 模块名
- from 模块名import 函数名
- import 模块名as新名字
二、模块定义
- 在模块中定义函数,可以重用代码,防止同个功能的代码反复去书写,可以存在在模块中,每次需要时调用即可。
- 在主程序中,变量名__name__的值是’main’, 而在导入的模块中,这个变量被设置为该模块的名称, 因此要让模块中的测试代码行为更为合理,可增加一条if语句,即if name==‘main’: test( );
- 让模块可用(两种办法:1)将模块放在正确的位置;2)告诉解释器到哪里去查找
- 包:为组织模块,可将其编组为包。包其实就是另一种模块,但它可以包含其他模块。模块扩展名为.py,而包则是一个目录。要被python视为包,目录中必须包含文件__init__.py;要将模块加入包中,只需要将模块文件放在包目录下即可。
三、探索模块(模块函数)
- dir函数:可查明模块中包含哪些东西,它列出对象的所有属性(函数、类、变量等),其中包含以下划线打头,这表明它并非供外部使用,当然我们也可以用startswith将其过滤掉
import copy
[ n for n in dir(copy) if not n.startswith('_')]
['Error', 'PyStringMap', 'copy', 'deepcopy', 'dispatch_table', 'error', 'name', 't', 'weakref']
- 变量__all__ :定义模块的公有接口
- help获取帮助
help (copy)->获取copy模块的帮助信息
help(copy.copy)->获取copy模块中copy函数的帮助信息
print(copy.copy.doc)打印函数copy的帮助文档信息 - 文档
print(rang.doc)->获取range模块的帮助文档信息 - 使用源代码
print (copy.file)->C:\Python35\lib\copy.py可以查看copy模块源代码所在位置
四、模块类型
- sys :访问与Python解释器紧密相关的变量和参数
- sys.argv:命令行参数,包括脚本名
`argv[0]一般是"被调用的脚本文件名或全路径”,这个与操作系统有关,argv[1]和以后就是传入的系统命令参数。 - sys.exit:退出当前程序,可通过可选参数指定返回值或错误信息
- sys.modules:将模块名映射到模块(仅限已导入的模块)
- sys.path:执行import语句时将这些目录中查找模块
- sys.platform:运行解释器“平台”名称
- sys.stdin/sys.stout/sys.stderr:类似于文件的流对象
- sys.argv:命令行参数,包括脚本名
- os模块:访问多个操作系统
- os.environ:包含环境变量的映射
- os.system(command):在子shell中执行操作系统命令
- os.sep:在路径中使用的分隔符
- os.pathsep:分隔不同路径的分隔符
- os.linesep:行分隔符(’\n’,’\r’或’\r\n’)
- os.urandom(n):返回n个字节的强加密随机数据
- fileinput:轻松迭代一系列文本文件中的所有行
- fileinput.input:这是其中最重要的函数,它返回一个可在for循环中进行迭代的对象;
- fileinput.filename:返回当前文件(即当前处理的行所属文件)的文件名;
- fileinput.lineno:返回当前行的编号;
- fileinput.nextfile:关闭当前文件并跳入到下一个文件,且计数时忽略跳过的行;
- time模块:获取当前时间、操作时间和日期、从字符串中读取日期、将日期格式化为字符串的函数
- time.asctime():将时间元组转换为字符串
- time.localtime():将秒数转换为表示当地时间的日期元组
- time.mktime():将日期元组转换为当地时间
- time.sleep():让解释器等待指定的秒数
- time.strptime():将一个字符串转换为时间元组
- time.time():返回当前的国际标准时间,以从新纪元开始的秒数表示。
- random模块:生成伪随机数的函数。
- shelve(只需了解其中的open函数,以文件名作为参数,返回一个shelf对象,用于存储数据)
import shelve
s=shelve.open('test.dat')
s['x']=['a','b','c']
s['x'].append('d')
s['x']->['a', 'b', 'c']
- argparse模块
import argparse
parser=argparse.ArgumentParser() #构建参数解释器
parser.add_argument('chr1') #添加参数
args=parser.parse_args() #解释参数
print(args)
四、re(正则表达式)
- 表达模式
模式字符串使用特殊的语法来表示一个正则表达式:
字母和数字表示他们自身,一个正则表达式模式中的字母和数字匹配同样的字符串。
多数字母和数字前加一个反斜杠时会拥有不同的含义;
标点符号只有被转义时才匹配自身,否则它们表示特殊含义;
反斜杠本身需要使用反斜杠转义;
由于正则表达式通常都包含反斜杠,所以最好使用原始字符串来表示。
主要模式:
- [ ]:匹配其中任意单个字符
- [^]:取反,表示不在 [ ]的字符
- .:匹配任意字符,除了换行符
- re*:匹配0个或多个的表达式
- re+:匹配1个或多个的表达式
- re?:匹配0个或1个由前面的正则表达式定义的片段,非贪婪模式
- |:或者,二选一
'python|perl' 或者写成’p(ython|erl)'
这两种写法均表示python或perl - \:转义字符
- \number:后项引用
- \0number…:如果反斜杠后面数字以0开头,表示匹配八进制数字所表示的ASCII值对应的字符
- \n:匹配换行符
- ^=\A:匹配字符串的开头
- $=\Z:匹配字符串的结尾
- ?:通过在子模式后面加上问号,可将其指定为可选的,即可包含可不包含
- {num}:表示重复,用大括号这对元字符实现重复匹配的功能 `re.search(r’ab{3}c’, ‘abbbc’}表示字符b重复三次
- {n1, n2}:定义重复范围,表示重复n1到n2次。
- 重复的元字符还有星号*(相当于{0, }) 加号+(相当于{1,}),问好?(相当于{0,1})
- \d:匹配数字
- \D:匹配任意非数字
- \A:匹配字符串开始
- \Z:匹配字符串结束,如果是存在换行,只匹配到换前的结束字符串
- \z:匹配字符串结束
- \G:匹配最后匹配完成的位置
- \b:单词的边界,`re.findall( r’\bFishC\b’, ‘FishC.com!FishC_com!FishC(FishC)’) ->[‘FishC’, FishC’, ‘FishC’]
- \B:非单词边界
- \w:匹配字符数字及下划线
- \W:匹配非字母数字及下划线
- \s:匹配任意空白字符
- \S:\s的取反
- \t:水平制表符
- \r:回车
- \f:换页符
- \v:垂直制表符
- \w:表示匹配Unicode中定义的单词字符
r' (http://)?(www\.)?python\.org'
#表示括号内的字符串可出现可不出现,输出如下:
'http://www.python.org'
'http://python.org'
'www.python.org'
'python.org'
?表示可出现1次或0次,还有其它符号表示出现多次:
**修饰符: ******
- re.I:忽略大小写
- re.L:做本地化识别匹配
- re.M:多行匹配
- re.S:使.匹配包括换行在内的所有字符
- re.U:根据Unicode字符集解析字符。这个标志影响\w, \W, \B, \b
- re.X:该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解
(pattern)*:pattern可重复0,1或多次;
(pattern)+:pattern可重复1次或多次;
(pattern){m,n}:pattern可出现重复m~n次。
贪婪和非贪婪:在正则表达式默认是贪婪匹配方式,即尽可能多的去匹配,当在表示重复的元字符后边再加上一个号?即可变为非贪婪模式
贪婪模式:
emphasis_pattern=r'\*(.+)\*'
re.sub(emphasis_pattern, r<em>\1</em>', '*This* is *it*!') ->'<em> This* is *it<\em>!'
非贪婪模式:
emphasis_pattern=r'\*(.+?)\*'
re.sub(emphasis_pattern, r<em>\1</em>', '*This* is *it*!') ->'<em>This<\em> is <em>it<\em>!'
2. 模块re中的重要函数
- compile(pattern [,flags]):根据包含正则表达式的字符串创建模式对象
p=re.compile('[A-Z]')
p.search('I love FishC.com!') -> <_sre.SRE_Match object; span=(0,1), match='I'>
p.findall('I love FishC.com!') ->['I', 'F', 'C']
例外一个例子:
import re
pattern=re.compile(r'\d+') #用于匹配至少一个数字
m=pattern.match('one12twothree34four') #查找头部,没有匹配
print (m) ->None
m=pattern.match('one12twothree34four', 2,10) #从'e'的位置开始匹配,没有匹配
print (m) ->None
m=pattern.match('one12twothree34four', 3, 10) #从'1'的位置开始匹配,正好匹配
print m -> <_sre.SRE_Match object at 0x10a42aac0>
m.group(0) ->'12'
m.start(0)->3
m.end() ->5
m.span()->(3,5)
- search(pattern, string[, flags]):在字符串中查找模式
re.search在给定的字符串中查找第一个与指定正则表达式匹配的子串,如果找到则返回MatchOject(结果为真),否则返回None, re.match 也是 - match(pattern, string, flags=0):尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回None.
import re print(re.match('www', 'www.runoob.com').span())->(0,3) print(re.match('com', 'www.runoob.com'))->None
- split(pattern, string[, maxsplit=0]):根据模式分割字符串
some_test='alpha, beta,,,,gamma delta'
re.split('[,]+' some_test) ->['alpha', 'beta', 'gamma', 'delta']
maxsplit指定最多分割多少次,默认为0,不限制次数
re.split ('[,]+', some_test, maxsplit=2) -> ['alpha', 'beta', 'gamma delta']
- findall (pattern, string):返回一个列表,其中包含字符串所有与模式匹配的子串
- sub(pat, rep1, string, count=0,flags=0):将字符串中与模式pat匹配的子串都替换为repl
pat:正则中的模式字符串
repl:替换的字符串,也可为一个函数
string:要被查找替换的原始字符串
count:模式匹配后替换的最大次数,默认0表示替换所有的匹配。
pat='{name}'
text='Dear{name}...'
re.sub(pat, 'Mr. Gumby', text) ->'Dear Mr. Gumby...'
- escape(string):对字符串中所有的正则表达式特殊字符都进行转义
re.escape('www.python.org') ->'www\\.python\\.org'
- 匹配对象和编组
**编组(group)?*在模块re中,查找与模式匹配的子串的函数都在找到时返回MatchObject对象。这种对象包含与模式匹配的子串信息,还包含模式的哪部分与子串的哪部分匹配的信息,这些子串部分称为编组。
编组就是放在括号中的子模式,它们是根据左边的括号数编号的,其中编号0指的是整个模式
There (was a (wee) (cooper)) who (lived in Fyfe)
包含以下编组:
0 There was a wee cooper who lived in Fyfe
1 was a wee cooper
2 wee
3 cooper
4 lived in Fyfe
通常,编组包含诸如通配符和重复运算符等特殊字符
re匹配对象的重要方法:
- group([group1, …]):获取与给定子模式(编组)匹配的子串
- start ([group]):返回与给定编组匹配的子串的起始位置
- end ([group]):返回与给定编组匹配的子串的终止位置(与切片一样,不包含终止位置)
- span([group]):返回与给定编组匹配的子串的起始和终止位置
m=re.match(r'www\.(.*)\..{3}', 'www.python.org')
m.group() ->'www.python.org'
m.group(1)->'python'
m.start(1)->4
m.end(1) -> 10
m.span(1) ->(4,10)
**’(?P…)‘分组匹配 **
import re
s='1102231990xxxxxxxx'
res=re.search('(?P<province>\d{3})(?P<city>\d{3}(?P<born_year>\d{3})', s)
print (res.groupdict())
此分组结果直接转为字典模式:
{'province': '110', 'city': '223', 'born_year': '199'}
- 替换中的组号和函数
在替换字符串中,任何类似于’\n’的转义序列都将被替换为与模式中编组n匹配的字符串。
emphasis_pattern=r'\*([^\*])\*'
re.sub(emphasis_pattern, r'<em>\1</em>', 'Hello, *world*!') -> 'Hello, <em>world</em>!