Python学习笔记之三:正则表达式和文件操作[通俗易懂]

Python (60) 2023-09-17 09:12

Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说Python学习笔记之三:正则表达式和文件操作[通俗易懂],希望能够帮助你!!!。

正则表达式无疑是学习任何一门语言中都必须要掌握的部分。学会了正则表达式之后,匹配字符串或提取字符串简直就是易如反掌。

Python学习笔记之三:正则表达式和文件操作[通俗易懂]_https://bianchenghao6.com/blog_Python_第1张

正则表达式之re模块

Python中正则表达式模块为re模块,是Python内置模块之一。掌握了re模块之后,可以很轻松的在爬虫工具中使用正则表达式来提取感兴趣的数据。

创建正则表达式

创建一个正则表达式可以使用compile函数,如:

re.compile("pattern"[, flags]) # 根据包含正则表达式的字符串创建模式对象,默认会正则表达式中的点“.”来匹配任意一个字符(但是不包含换行符)。

其中,flags参数是正则表达式标记符。

  1. flags参数如果使用re.DOTALL,表示把换行符当做普通字符对待,“.”也能匹配到换行符;

  2. 如果使用re.IGNORECASE表示不区分大小写进行匹配;

  3. 如果不传flags参数,默认的,“^”会匹配整个字符串的开头,“$”会匹配整个字符串的结尾,flags参数如果使用re.MULTILINE,会使得“^”“$”分别匹配每一行的开头和结尾。

例:

Python学习笔记之三:正则表达式和文件操作[通俗易懂]_https://bianchenghao6.com/blog_Python_第2张

创建正则表达式

正则表达式中的字符串前面使用了r,表示让Python解释器不要对r后面的字符串进行Python的转义处理。如果不使用r,则需要写成my_re = re.compile("\\d+"),因为反斜杠\在Python中也是表示转义的意思。

常用的正则表达式符号

在正则表达式中,

  1. “^”表示匹配字符串开头,

  2. “$”表示匹配字符串末尾,

  3. 点“.”表示匹配一个任意字符,

  4. 问号“?”表示匹配零个或一个前一字符,

  5. 星号“*”表示匹配零个或一个或多个前一字符,

  6. 加号“+”表示匹配一个或多个前一字符,

  7. “\d”表示匹配一个数字,

  8. “\D”表示匹配一个非数字,

  9. “\s”表示匹配一个空白符,

  10. “\S”表示匹配一个非空白符,

  11. “\w”表示匹配一个单词字符(即a到z,或A到Z,或0到9中的任意字符),

  12. “\W”表示匹配一个非单词字符,

例如:

  1. "\d+$"可以匹配"928374",但不能匹配"91829x",因为"\d+$"末尾有个$符号,表示必须以数字结尾,所以该正则表达式不匹配"91829x"。

  2. "\s*"可以匹配" ",因为字符串里面全是空白符,而正则表达式"\s*"表示匹配零个或一个或多个空白符。

  3. "^89s\s+me.$"可以匹配"89s mew",但不能匹配"89s me",因为正则表达式"^89s\s+me.$"结尾处有一个点号,表示要以"me"和任意一个字符结尾。如果把点号"."改成".?",则两个字符串都能匹配,因为问号表示该点号匹配的字符可有可无,所以两个字符串都能匹配上。

利用正则表达式查找字符串

re.search(pattern, "string"[, flags]) # 在字符串中寻找模式,寻找第一个匹配,找到则返回MatchObject,没找到返回None,pattern可以为字符串也可以为模式对象。

例:

Python学习笔记之三:正则表达式和文件操作[通俗易懂]_https://bianchenghao6.com/blog_Python_第3张

search

说明:

正则表达式中可以使用小括号,小括号表示分组。其中,第一对小括号表示第1组,第二对小括号表示第2组,以此类推。第0组表示整个正则表达式。

在使用search方法根据正则表达式搜索字符串时,如果搜索到了内容,该方法会返回一个MatchObject对象,在该对象上,我们可以使用m.group()方法来获取分组的内容,比如m.group(1)表示获取第一个分组匹配到的内容,即正则表达式中第一个小括号中的正则表达式匹配到的内容。m.group()不传参数时默认参数是0,表示获取整个正则表达式匹配到的内容。

注意:

我们在每次使用re.search("pattern", "string")方法时,re模块会根据pattern参数先编译成正则表达式对象,然后使用该对象在string参数中查找匹配的部分。如果每次调用该方法都编译一次正则表达式对象,无疑是对性能极大的浪费,我们其实可以预先编译好,然后直接在编译好的正则表达式对象上使用search方法,对正则表达式对象最大限度的复用,从而提升匹配的性能。例如:

re.search(r"\shan(ds)ome\s", text)

也可以写成

my_re = re.compile(r"\shan(ds)ome\s")

my_re.search(text)

上面两种操作是等价的。

利用正则表达式匹配字符串开头部分

re.match(pattern, "string"[, flags]) # 在字符串开头匹配,模式匹配完毕则返回MatchObject,未匹配上则返回None。注意,match方法是从字符串string开头开始匹配的,而不是像search一样,在字符串string的任意位置查找。例如:match("\d+[a-z]", "o89iuj")与search("^\d+[a-z]", "o89iuj")等价。

例:

Python学习笔记之三:正则表达式和文件操作[通俗易懂]_https://bianchenghao6.com/blog_Python_第4张

分组查找

利用正则表达式分隔字符串

Python的字符串str也有spilt()方法,但是该方法并不支持传入正则表达式。使用re.split()方法可以根据正则表达式来分割字符串。

re.split(pattern, "string"[, maxsplit=0]) # 根据模式的匹配项来分割字符串,如果模式包含小括号,小括号中的内容会散布在分割后的子字符串之间,例如re.split("o(o)", "foobar")结果为["f", "o", "bar"]。

例如:

p = re.compile(r'\d+')

print p.split('one1two2three3four4')

输出:

["one", "two", "three", "four", ""]

利用正则表达式find()方法查找(重点)

re.findall(pattern, "string", flags=0) # 列出字符串中模式的所有匹配项,返回一个列表。

  1. 当给出的正则表达式中带有多个括号时,列表的元素为多个字符串组成的tuple,tuple中字符串个数与括号对数相同,字符串内容与每个括号内的正则表达式相对应,并且排放顺序是按括号出现的顺序。

  2. 当给出的正则表达式中带有一个括号时,列表的元素为字符串,此字符串的内容与括号中的正则表达式相对应(不是整个正则表达式的匹配内容)。

  3. 当给出的正则表达式中不带括号时,列表的元素为字符串,此字符串为整个正则表达式匹配的内容。

例如:

列表中不带括号,返回的列表中每个元素为整个正则表达式匹配到的内容:

Python学习笔记之三:正则表达式和文件操作[通俗易懂]_https://bianchenghao6.com/blog_Python_第5张

列表中不带括号,返回的列表中每个元素为整个正则表达式匹配到的内容

列表中带一个括号,返回的列表中元素为括号匹配到的内容:

Python学习笔记之三:正则表达式和文件操作[通俗易懂]_https://bianchenghao6.com/blog_Python_第6张

列表中带一个括号,返回的列表中元素为括号匹配到的内容

列表中带多个个括号,返回的列表中元素为多个字符串组成的tuple,tuple中字符串个数与括号对数相同,字符串内容与每个括号内的正则表达式相对应:

Python学习笔记之三:正则表达式和文件操作[通俗易懂]_https://bianchenghao6.com/blog_Python_第7张

列表中带多个个括号,返回的列表中元素为多个字符串组成的tuple

re.finditer(pattern, "string", flags=0) # 与findall效果一样,不过返回的结果是一个生成器,专门产生MatchObject,而不像findall那样返回一个列表。

利用正则表达式替换字符串

re.sub(pattern, repl, string[, count=0]) # 将字符串string中所有pattern的匹配项用repl来替换。

re.subn(pattern, repl, string[, count=0] # 和re.sub(...)效果一样,不过,subn返回一个元组结果:(new_string, number_of_subs_made)

例如:

Python学习笔记之三:正则表达式和文件操作[通俗易懂]_https://bianchenghao6.com/blog_Python_第8张

sub

正则表达式语法转义

re.escape(string) # 将字符串中所有特殊正则表达式字符转义,如果有一个字符串中包含了正则表达式语法的特殊字符,又想匹配这些字符,就可以使用re.escape(string)来进行转义,使得该字符串中的所有字符都当做原生字符来匹配。

文件操作:

创建文件描述符(打开文件)

f = open('D:\\Python36\\file.log', 'r+')

表示打开“D:\Python36\file.log”这个文件。第一个参数是文件路径,第二个参数是文件操作选项,r表示获取该文件的读操作权限,如下图:

Python学习笔记之三:正则表达式和文件操作[通俗易懂]_https://bianchenghao6.com/blog_Python_第9张

文件操作选项

open()还有第三个参数,open()第3个参数表示缓冲。0或False表示不使用缓冲,1表示使用,-1表示使用默认大小的缓冲区,大于1的数表示设置缓冲区的大小。

with模式

我们在使用open打开文件之后,一般都要使用f.close()关闭这个文件描述符,要不然很容易造成内存泄漏。但是,毕竟是人工操作关闭,那么,很容易忘记编写f.close()。

我们可以使用:

Python学习笔记之三:正则表达式和文件操作[通俗易懂]_https://bianchenghao6.com/blog_Python_第10张

with模式

在with操作结束之后,with会自动调用f.close()来关闭这个文件描述符。非常方便。

读取指定数量的内容

f.read() # 该方法可以传入整数参数,不传参数表示读取f中剩余的所有字节的内容,传参数表示读多少个字节或者字符。

读取一行

f.readline() # 读取一行的内容。注意:换行符也会读进去(换行符在末尾),该方法也可以传入整数参数。带参数表示读取多少字节。

写入文件内容

f.write('This is a test\n') # 把参数中的字符串写到文件中

f.flush() # 把写入的内容刷新到文件当中

按行写入

f.writelines(lines) # 多行写入。其中,参数lines是个可迭代对象。该函数表示把lines中元素一个一个写入文件当中。注意:该方法并不会在lines的每一项后面添加换行符,如果写入一行之后,需要换行再次写入的话,需要自己添加\n换行符。

注意:

在windows下用文本模式读取文件中的文本时,Python会将\r\n转换成\n。在windows下用文本模式写文件时,会将\n转换成\r\n。

更多文章

  1. Python学习笔记之一:字符串常用操作和格式化高级操作

  2. Python学习笔记之二:列表、集合、字典

  3. 爬虫进阶:CrawlSpider爬取169ee全站美女图片

  4. Python网络爬虫requests、bs4爬取空姐网图片

  5. Python网络爬虫:空姐网、糗百、xxx结果图与源码

Python学习笔记之三:正则表达式和文件操作[通俗易懂]_https://bianchenghao6.com/blog_Python_第11张

今天的分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

发表回复