Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说Python学习笔记之三:正则表达式和文件操作[通俗易懂],希望能够帮助你!!!。
正则表达式无疑是学习任何一门语言中都必须要掌握的部分。学会了正则表达式之后,匹配字符串或提取字符串简直就是易如反掌。
Python中正则表达式模块为re模块,是Python内置模块之一。掌握了re模块之后,可以很轻松的在爬虫工具中使用正则表达式来提取感兴趣的数据。
创建一个正则表达式可以使用compile函数,如:
re.compile("pattern"[, flags]) # 根据包含正则表达式的字符串创建模式对象,默认会正则表达式中的点“.”来匹配任意一个字符(但是不包含换行符)。
其中,flags参数是正则表达式标记符。
flags参数如果使用re.DOTALL,表示把换行符当做普通字符对待,“.”也能匹配到换行符;
如果使用re.IGNORECASE表示不区分大小写进行匹配;
如果不传flags参数,默认的,“^”会匹配整个字符串的开头,“$”会匹配整个字符串的结尾,flags参数如果使用re.MULTILINE,会使得“^”“$”分别匹配每一行的开头和结尾。
例:
正则表达式中的字符串前面使用了r,表示让Python解释器不要对r后面的字符串进行Python的转义处理。如果不使用r,则需要写成my_re = re.compile("\\d+"),因为反斜杠\在Python中也是表示转义的意思。
在正则表达式中,
“^”表示匹配字符串开头,
“$”表示匹配字符串末尾,
点“.”表示匹配一个任意字符,
问号“?”表示匹配零个或一个前一字符,
星号“*”表示匹配零个或一个或多个前一字符,
加号“+”表示匹配一个或多个前一字符,
“\d”表示匹配一个数字,
“\D”表示匹配一个非数字,
“\s”表示匹配一个空白符,
“\S”表示匹配一个非空白符,
“\w”表示匹配一个单词字符(即a到z,或A到Z,或0到9中的任意字符),
“\W”表示匹配一个非单词字符,
例如:
"\d+$"可以匹配"928374",但不能匹配"91829x",因为"\d+$"末尾有个$符号,表示必须以数字结尾,所以该正则表达式不匹配"91829x"。
"\s*"可以匹配" ",因为字符串里面全是空白符,而正则表达式"\s*"表示匹配零个或一个或多个空白符。
"^89s\s+me.$"可以匹配"89s mew",但不能匹配"89s me",因为正则表达式"^89s\s+me.$"结尾处有一个点号,表示要以"me"和任意一个字符结尾。如果把点号"."改成".?",则两个字符串都能匹配,因为问号表示该点号匹配的字符可有可无,所以两个字符串都能匹配上。
re.search(pattern, "string"[, flags]) # 在字符串中寻找模式,寻找第一个匹配,找到则返回MatchObject,没找到返回None,pattern可以为字符串也可以为模式对象。
例:
说明:
正则表达式中可以使用小括号,小括号表示分组。其中,第一对小括号表示第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的字符串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", ""]
re.findall(pattern, "string", flags=0) # 列出字符串中模式的所有匹配项,返回一个列表。
当给出的正则表达式中带有多个括号时,列表的元素为多个字符串组成的tuple,tuple中字符串个数与括号对数相同,字符串内容与每个括号内的正则表达式相对应,并且排放顺序是按括号出现的顺序。
当给出的正则表达式中带有一个括号时,列表的元素为字符串,此字符串的内容与括号中的正则表达式相对应(不是整个正则表达式的匹配内容)。
当给出的正则表达式中不带括号时,列表的元素为字符串,此字符串为整个正则表达式匹配的内容。
例如:
列表中不带括号,返回的列表中每个元素为整个正则表达式匹配到的内容:
列表中带一个括号,返回的列表中元素为括号匹配到的内容:
列表中带多个个括号,返回的列表中元素为多个字符串组成的tuple,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)
例如:
re.escape(string) # 将字符串中所有特殊正则表达式字符转义,如果有一个字符串中包含了正则表达式语法的特殊字符,又想匹配这些字符,就可以使用re.escape(string)来进行转义,使得该字符串中的所有字符都当做原生字符来匹配。
f = open('D:\\Python36\\file.log', 'r+')
表示打开“D:\Python36\file.log”这个文件。第一个参数是文件路径,第二个参数是文件操作选项,r表示获取该文件的读操作权限,如下图:
open()还有第三个参数,open()第3个参数表示缓冲。0或False表示不使用缓冲,1表示使用,-1表示使用默认大小的缓冲区,大于1的数表示设置缓冲区的大小。
我们在使用open打开文件之后,一般都要使用f.close()关闭这个文件描述符,要不然很容易造成内存泄漏。但是,毕竟是人工操作关闭,那么,很容易忘记编写f.close()。
我们可以使用:
在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。
Python学习笔记之一:字符串常用操作和格式化高级操作
Python学习笔记之二:列表、集合、字典
爬虫进阶:CrawlSpider爬取169ee全站美女图片
Python网络爬虫requests、bs4爬取空姐网图片
Python网络爬虫:空姐网、糗百、xxx结果图与源码
今天的分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。