回顾:

1、文件对象:

  • open('file','mode','bufsize')
  • read,readline,readlines,write,writelines,flush,seek,tell

2、模块:os

  • 文件系统接口

3、模块:os.path

4、对象流失化,持久化:

  • pickle

文件本身在python内部是可迭代对象:

获取当前系统的所有模块

help有两种模式,一个是函数方式调用,另一个是交互式模式调用

help('modules')  或者

help()     是交互式接口


python的正则表达式:

re:

元字符

.              匹配任意单个字符

[.....]        匹配指定范围内的字符

[^.....]      匹配指定范围以外的字符

?             匹配此前的字符0次或一次

+             匹配此前的字符1次或多次

{m}          匹配前面的字符m次

{m,n}       匹配至少m次,至多n次

{0,n}        匹配至多n次,也可以没有

{m,}         匹配至少m次,至多不限

^              牟定行首

$              牟定行尾

pat1|pat2       两种模式取其一

(.....)         分组

\b             可以牟定一个单词

[0-9]: \d    匹配任意数字

[0-9a-zA-Z]   匹配任意数字和字符

[0-9a-zA-Z]:\w,\W对\w取反      \w是字符集

\s:任意空白字符,[\n\t\f\v\r],      大S \S 和小s相反,表示空白字符以外的任意字符

\s是它们的集合:\n表空白,\t制表符,空白   \f表空白、\v垂直制表符,空白、\r换行符

\nn    可以实现后向引用,引用(.....) 分组中的匹配到的内容

(*|+|?|{})?:使用非贪婪模式


re.match

match对象:在re中可以指定起始位置,结束位置,匹配到的字符等

re本身有很多内置方法和属性

re.match对象有很多内置属性

match方法匹配到的结果会生成match对象,必须在获取match对象之后,才能获取内部信息,

如果利用re内部的方法match或search匹配到字符串内容了,就可以对某些match对象使用function获取

在abc字串中找a,匹配到后就返回一个match对象,并告诉在内存什么位置,此对象必须使用变量名引用,

因为任何对象都是保存在内存中,要想引用,必须将内存对象保存在变量名的引用中,否则创建完就消失了


定义一个变量引用m1,这时候m1就是匹配对象,m1本身内部就会有一些方法

match对象是一次正则表达式匹配查询的结果,包含了很多关于此次匹配的信息,要通过内部的属性和方法来获取这些信息

     


re是匹配时使用的pattern对象,需要说明的是re这个模块在实现使用模式匹配所使用的文本时,会首先将字符 (a) 编译compile,编译完之后再去做匹配,如果没有手动编译,它会自动编译。

因此所使用的re即正则表达式,不再是模式本身(a),而是下面被编译的模式

括号中的 表示是正则表达式的模式,


手动编译匹配模式

在abcdefg中查找bc

第一种方式手动编译,模式为bc

pat = re.compile('bc')     手动编译模式bc,这里pat是一个模式对象,

match = pat.match('abcdefg')    使用模式对象去执行一些匹配类的操作,这里pat调用compile('bc') 这个模式,来调用'abcdefg'这个字符串,

第二种模式是自动编译


group解析:

要想实现分组,得在正则表达式中使用()括起来,即(.....) ,第一个()称为group1,第二个()称为group2,因此要想使用group和groups来获取分组结果,一定是这个模式在匹配到结果中的本身进行分组

匹配次数可能是多次,每次匹配有可能会分为多个组

例子:hellopr world:在这个字符串中匹配o会出现两次

(o):如果对这个模式加(),就表示在()中的模式表示第一个分组,即o是第一个分组;

(0(.)):如果o后面可以出现任意字符,且将点加括号--> (.),那么(.)就表示模式中的第二个分组;

利用(0(.))这个模式在hellopr world字串中总共有两次匹配,即op和or;那么对第一次匹配来讲匹配的是op,那么第一个()中的内容0(.)即group1匹配的是op,第二个括号中的内容 . 即group2匹配的是p;

在字符串中进行模式匹配可能不止一次匹配(op,or),因此每一次匹配都会有分组,而且分组可能不止一个(group1、group2、......)

因此对于上述第一次匹配内容op会分为group1即op,和group2即p,

(0(.)):是一个模式,这个模式第一次匹配到的就是op,

group1表示外面的()匹配到的内容即o(.),所以匹配到的内容为op;

group2表示里面的()中的内容匹配的内容即点号 匹配的内容,匹配到的是o后面的字符p,即group2为p

groups就表示每一次匹配中多个分组的集合

第二次匹配时,匹配的是or,那么group1是or,group2是r

使用group1时,就是使用模式(0(.))中第一个左括号 ( 和它右括号)中的内容----即o(.)----进行匹配

使用group2时,就是使用模式(0(.))中第二个左括号 ( 和它右括号)中的内容----即 . ----进行匹配


例子解析:hellopr world

定义字符串str1,手动编译模式(0(.)),利用search搜索字符串str1,这个结果会生成一个匹配对象,把匹配对象保存在变量mat1中,

然后获取mat1的分组,直接给group(),会返回第一次匹配到的整个串即op,

groups    每一次匹配都可能由多个分组,把一次匹配到的多个分组以元组的方式返回叫groups


pos和endpos

pos是搜索字串时,是在原串的哪个位置开始搜索,一直到哪个位置结束搜索的,默认是搜索串的整个组成部分

指定了模式被匹配到的串本身(模式是a,串本身是abc),是从原串的哪个字符位置开始匹配的

endpos表示使用模式 a 搜索字串 abc 时,从哪个位置搜索,一直到哪个位置结束搜索

(一般都是从头开始,到结尾,可以看出原串的大小)

模式匹配位置即搜索位置是可以指定的,默认时从头开始,到最后结束


start和end 

start、end  模式 a 在原串 abc 中匹配时所匹配到的那个串的第一次和结束位置

(即匹配时,模式 a 被匹配到,a 在原串中第一次被搜索到和最后一次被搜索到这两个位置)

pos和endpos是属性,start和end是方法


re.search      search(pattern, string, flags=0)

search的意义:在字符串string中,按照pattern进行搜索,并返回第一次初步匹配到的结果,如果有其他匹配,即使在同一行也不做匹配。

search只返回第一次匹配到的结果,返回结果是匹配对象

                


findall

findall返回多次,返回结果仍然是一个匹配对象,如果匹配对象是多个,则以列表的方式来返回所有的匹配对象

finditer(pattern, string, flags=0)

finditer和findall相同,区别在于findall返回的是列表,finditer返回的是迭代器

                       


re.slipt  


re.sub   

sub(pattern, repl, string, count=0, flags=0)    把pattern在string中匹配的内容由repl替换,count是指替换次数

直接返回由repl替换的字符串

          

subn    和sub相同,区别在subn返回的是替换的次数

subn返回的是元组,sub返回的是一个字串


re.search:返回一个macth对象

match对象的属性和方法

  • 属性:
  • string    字符串本身
  • re          正则表达式
  • pos
  • endpos 搜索字符串起始位置
  • 方法:
  • group()
  • start()
  • end()

re.findall:返回一个列表

re.sub:返回替换后的整个串

re.subn:返回元组:替换后的串及替换次数

re.compile:模式对象,手动编译出来

对象都是保存在内存中的,所以要想访问match对象,得使用对象进行获取,获取后在对象是上施加一些操作,但如果回复的对象是空的,就没办法执行了,所以需要提前判断


flags:

I或IGNORECASE:忽略字符大小写

M或MULTILINE:多行匹配

A或ASCII:仅执行8位ASCII码匹配

U或UNICODE:执行unicode匹配

pat2 = re.compile('.(o(.))',re.I)     手动编译匹配模式,re.I表示匹配时忽略大小

pat2 = re.compile('.(o(.))',re.I|re.M)    | 表示或者    re.M:表示跨多行匹配

           


思考:复制/etc/passwd到/tmp,如何替换/tmp/passwd中的/bin/bash为/BIN/BASH?

最新文章

  1. JS魔法堂:定义页面的Dispose方法——[before]unload事件启示录
  2. 【Gerrit】Gerrit cmd query (gerrit命令行查询change信息)
  3. 为android项目集成maven
  4. 【Spring】Spring系列5之Spring支持事务处理
  5. Java 集合系列 12 TreeMap
  6. python 爬取百度云资源
  7. Thinkphp 获取当前url
  8. Oracle外部表的使用
  9. C++字符串函数与C字符串函数比较
  10. Android 调整屏幕分辩率
  11. LeetCode: Distinct Subsequences [115]
  12. ubuntu python3.6 找不到_sqlite3
  13. 基于jQuery的一个提示功能的实现
  14. pig的udf编写
  15. Linux系统安装jdk教程
  16. c#电子印章制作管理系统
  17. linux安装sonar
  18. Nginx 防盗链配置
  19. classpath路径配置
  20. vue 局部引入js插件

热门文章

  1. Go语言专题
  2. MyEclipse使用Ant打包项目
  3. over(partition by)开窗函数的使用
  4. centos6编译安装mysql5.5
  5. Linux Redhat 安装免费yum源
  6. python之面向对象的高级进阶
  7. python简说(二十八)json.path
  8. 线程同步——用户模式下线程同步——Interlocked实现线程同步
  9. 20145204张亚军——web安全基础实践
  10. 20145320《网络对抗》逆向及Bof基础实践