python学习笔记分享(三十三)网络爬虫(2)正则表达式

IT Xiao Ang Zai     2019年3月12号

版本:python3.7

编程软件:Pycharm,Sublime Text 3

这里要介绍的是python的re模块中正则表达式的语法,其他的暂时不介绍,有兴趣的朋友可以自行了解。

一:正则表达式简介

在编写处理字符串的程序的时候,经常需要查找某些复杂规则的字符串。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本字符串。用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“字符串模式规则”,匹配这些模式规则对应的字符串。

二:re模块

在python中,用re模块实现正则表达式。re模块使python语言拥有全部的正则表达式功能。

如果需要重复使用正则表达式,可以先将其编译成模式对象,用compile()函数。它根据一个模式字符串和可选的标志参数生成一个正则表达式对象。生成的对象可以用一些方法进行正则表达式和匹配。

re模块也可以直接引用一些函数实现和正则表达式的方法相同的功能。下面会一一介绍一些常用的正则表达式的内容。

四:处理函数(常用)

1.re.search()函数

作用:在整个字符串中查找并返回第一个成功的匹配。

格式:re.search(pattern,string,flags=0)

参数说明:

pattern 匹配的正则模式
string 匹配的字符串
flags 编译标志位,用于控制正则表达式的匹配方式

返回值:匹配成功返回一个匹配的对象,否者返回None。

获取正则表达式:可以用group(num)或groups()匹配对象函数获取匹配表达式。

group(num):一次可以输入多个组号,根据num匹配对应的值并生成元组,从1开始。

groups():返回一个包含所有子组字符串的元组。

2.re.match()函数

作用:如果不是起始位置匹配成功的话,就返回None。

格式:re.match(pattern,string,flags=0)

参数说明:

pattern 匹配的正则模式
string 匹配的字符串
flags 编译标志位,用于控制正则表达式的匹配方式

返回值:匹配成功返回一个匹配的对象,否则返回None。

这里可以发现,它和search()函数类似。但还是有区别:
re.match只匹配开始,如果开始不符合正则模式,就匹配失败,函数返回None;而re.search匹配整个字符串,只要找到一个匹配符合就算成功。

3.正则表达式对象中的search(),match()方法和re.search(),re.match()的区别

先来看一下它们的原型:
 

import re

re.search(pattern,string,flags=0)
p.search(string[,pos[,endpos]])
re.match(pattern,string,flags=0)
p.match(string[,pos[,endpos]])

其实可以看到,正则表达式对象就是把re.search()与re.match()其中的pattern和编译标志在用compile()函数生成正则表达式对象时就用了,这里直接写string参数把要匹配的字符串添加即可。

其他区别:

(1) re.search()与re.match()返回的是一个匹配的对象,需要使用group()或groups()才可以获得匹配的字符串。

(2)正则表达式对象对应的方法可以设置搜索的开始位置和结束位置。

(3)start(),end()和span()分别返回匹配的开始位置,结束位置以及匹配的范围。

实例:

import re

#re.search()与re.match()
a = "This is my best love thing."
print(re.search("is",a)) #不在开始位置匹配
print(re.search("is",a).span()) #不在开始位置匹配,用span()表示范围
print(re.search("my",a).group()) #不在开始位置匹配,用group()查找内容
print(re.match("my",a))  #不在开始位置匹配
print(re.match("This",a))  #在开始位置匹配
print(re.match("This",a).start())  #在开始位置匹配,用start()表示开始位置
print(re.match("This",a).end())  #在开始位置匹配,用end()表示结束位置
print(re.match("This",a).span())  #在开始位置匹配,用span()表示范围
print(re.match("This",a).group())  #在开始位置匹配,用group()查找内容
print(re.match("This",a).group(0))  #在开始位置匹配,用group()查找内容
k = re.compile("This is")
print(k.search(a).group())  #在开始位置匹配,用group()查找内容

结果如下:

4.re.sub()函数

作用:替换字符串中的匹配项。

格式:re.sub(pattern,repl,string,count=0)

参数说明:

pattern 正则中的模式字符串
repl 替换的字符串,也可以为一个函数
string 要被替换的字符串
count 模式替换后的最大次数,默认0表示替换所有的匹配

返回值:替换后的字符串。

5.compile()函数

作用:编译正则表达式,生成一个正则表达式模式对象,配合search()和match()函数使用。

格式:re.compile(pattern[,flags])

参数说明:
 

pattern 字符串形式的正则表达式
flags 编译标志(匹配模式),可以修改正则表达式的工作方式

flags具体参数为:
 

标志 含义
ASCI,A(re.A) 使得转义字符如 \w, \W, \b, \B, \d, \D, \s, \S只能匹配ASCII字符,仅对Unicode模式有意义
DOTALL,S(re.S) 使得点号(.)匹配任何符号,包括换行符
IGNORECASE,I(re.I) 匹配的时候不区分大小写
LOCALE,L(re.L) 表示特殊字符集 \w, \W, \b, \B, \s, \S 依赖于当前语言(区域)设置,而不是Unicode数据库
MULTLINE,M(re.M) 多行匹配,影响^和$,使得^不仅匹配字符串的开头,还匹配每一行的行首;$不仅匹配字符串的结尾,还匹配每一行的行尾
VERBOSE,X(for 'extended')(re.X) 启动详细的正则表达式,忽略空格和'#'后面的注释,可以使用注释'#',除了'\#',其它'#'都会被当作注释

其中re.compile()只是生成一个模式对象,该对象有很多实用方法:

比如search(),match(),sub(),group(),start(),end(),span(),用法和上面的相同。

还有下面几个方法:

(1)findall()方法

作用:在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。

格式:findall(string[,pos[,endpos])

参数说明:

string 待匹配的字符串。

pos 可选参数,指定字符串的起始位置,默认为 0。

endpos 可选参数,指定字符串的结束位置,默认为字符串的长度。

(2)re.finditer()

作用:在找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回。

格式:re.finditer(pattern,string,flags=0)

参数说明:
 

pattern 匹配的正则表达式
string 要匹配的字符串。
flags 编译标志位

(3)re.split()

作用:按照能够匹配的子串将字符串分割后返回列表。

格式:re.split(pattern,string[,maxsplit=0,flags=0])

参数说明:

pattern 匹配的正则表达式
string 要匹配的字符串。
maxsplit 分隔次数,maxsplit=1 分隔一次,默认为 0,不限制次数。
flags 编译标志位

三:简单匹配

1.通配符

正则表达式可以用一个点号(.)表示,可以匹配除了换行符之外的任何字符,如果用compile()生成的模式对象,还可以传入编译标志re.S,使其可以匹配所有字符。

2.反斜杠

反斜杠的用法有两种,既可以剥夺元字符的特殊能力,又可以让一些特殊字符拥有一些特殊能力,你如\d就可以匹配数字。

3.字符类

可以用中括号[]将任何内容包起来形成一个字符类,只要匹配这个字符类中的任何字符,就算匹配成功。对于字母来说,是区分大小写的,可以用编译标志re.I改变,或者修改一下。用小斜杠"-"表示范围。

4.重复匹配

用大括号这对元字符来实现重复匹配的功能,可以有个范围。

四:常用的元字符

由于正则表达式的元字符有很多,下面介绍几个实际上常用的元字符:
1.点号(.)

点号就是通配符,匹配除了换行符之外的任何字符,如果用compile()生成的模式对象,还可以传入编译标志re.S,使其可以匹配所有字符。

2.脱字符(^)

脱字符表示字符串的开始位置,只有字符串出现在开头才会匹配。

3.美元符($)

脱字符表示字符串的结束位置,只有字符串出现在末尾才会匹配。

4.重复符(*,+,?)

星号(*)相当于{0,}

加号(+)相当于{1,}

问号(?)相当于{0,1}

5.大括号{}

大括号{}用于重复次数。如果前面是一个子组,表示子组的重复次数。也可以表示范围。

6.中括号[]

中括号是一个字符集合,被其包含的元字符都失去了特殊的功能。可以看成普通的字符。除了一些符号,比如小斜杠(-)表示范围,反斜杠(\)转义,脱字符(^)取反。

7.管道符(|)

管道符和逻辑或的功能类似。

8.小括号()

小括号的功能是把里面的东西变成元组。

9.反斜杠(\)

除了上面说的功能以外,反斜杠如果跟数字在1-99,表示对应的子组所匹配的字符串;如果跟数字是0开头或三位数字,表示一个八进制数对应的ASCII字符。

五:特殊字符

就是反斜杠后面加一些东西后对应的模式字符,下面是常用的:
 

\d 匹配数字。
\D 匹配非数。
\s 匹配空白字符,
\S 匹配非空白字符。
\w 匹配包括下划线的任何单词字符。
\W 匹配任何非单词字符。

上面就是正则表达式的基本内容,在之后的文章中就会配合爬虫进行他们的实例运用。

猜你喜欢

转载自blog.csdn.net/ITxiaoangzai/article/details/88427011