第十九天
正则表达式
正则表达式是一个强大的字符串处理技术,几乎任何和字符串有关的操作都可以使用正则表达式来完成,如果想要去爬取数据,那么正则表达式更是不可或缺的技能。正则表达式的在不同的语言中使用方式可能不一样,不过只要学会了任意一门语言的正则表达式用法,其他语言中大部分也只是换了个函数的名称而已,本质都是一样的。
1、正则表达式
1.1、基本符号
1.点号“.”
点号可以代替除了换行符(\n)以外的任何一个字符,包括但不限于英文字母、数字、汉字、英文标点符号和中文标点符号;
2.星号“*”
一个星号可以表示它前面的一个子表达式(普通字符、另一个或几个正则表达式符号)0次到无限次;
3.问号“?”
问号表示它前面的子表达式0次或者1次。注意,这里的问号是英文问号;
4.反斜杠“\”
反斜杠在正则表达式里面不能单独使用,甚至在整个Python里都不能单独使用。反斜杠需要和其他的字符配合使用来把特殊符号变成普通符号,把普通符号变成特殊符号;如:“\n”。
5.数字“\d”
正则表达式里面使用“\d”来表示一位数字。再次强调一下,“\d”虽然是由反斜杠和字母d构成的,但是要把“\d”看成一个正则表达式符号整体;
6.小括号“()”
小括号可以把括号里面的内容提取出来;
-
^ 符号
匹配开始位置,多行模式下匹配每一行的开始; -
$符号
匹配结束位置,多行模式下匹配每一行的结束; -
{m,n}
匹配前一个元字符m到n次;
1.2、re模块
在python中,使用正则表达式需要引入re模块,re模块中定义了很多对字符串操作的方法
re模块核心函数:
1.2.1、compile()函数
编译正则表达式pattern,返回正则表达式对象,供 match() 和 search() 这两个函数使用;
语法:re.compile(pattern[, flags])
pattern、一个字符串形式的正则表达式
flags : 可选,表示匹配模式,比如忽略大小写,多行模式等,具体参数为:
1、re.I 忽略大小写;
2、re.M 多行模式;
3、re.S 即为 . 并且包括换行符在内的任意字符(. 不包括换行符);
4、re.X 为了增加可读性,忽略空格和 # 后面的注释;
pattern = re.compile(r'\d+') # 用于匹配至少一个数字
ret = pattern.match('234hjk22lk') # match从开始匹配
print(ret.group() if ret else '没有匹配数据') # 234
pattern = re.compile(r'\d+')
ret = pattern.match('wasd234hjk22lk')
print(ret.group() if ret else '没有匹配数据') # 没有匹配数据
1.2.2、match()函数
从字符串的最开始与pattern进行匹配,匹配成功返回匹配对象(只有一个结果),否则返回None;
语法:re.match(pattern, string, flags=0)
pattern、匹配的正则表达式
string、要匹配的字符串
flags、是否区分大小写等匹配方式
ret = re.match('速度与激情\d','速度与激情8')
print(ret.group() if ret else '没有匹配数据') # 速度与激情8
ret = re.match('速度与激情[12345679]','速度与激情8')
print(ret.group() if ret else '没有匹配数据') # 没有匹配数据
1.2.3、search()函数
与match()工作的方式一样,但是search()不是从最开始匹配的,而是从任意位置查找第一次匹配的内容。如果所有的字串都没有匹配成功,返回None,否则返回匹配对象;
语法:re.search(pattern, string, flags=0)
ret = re.search(r'\d+','wasd12jkl45op')
print(ret.group() if ret else '没有匹配数据') # 12
1.2.4、findall()函数
查找字符串中所有出现的正则表达式模式,并返回一个匹配列表;match 和 search 是匹配一次 findall 匹配所有
语法:findall(string[, pos[, endpos]])
1、string : 待匹配的字符串。
2、pos : 可选参数,指定字符串的起始位置,默认为 0。
3、endpos : 可选参数,指定字符串的结束位置,默认为字符串的长度。
pattern = re.compile(r'\d{2}\w')
ret = pattern.findall('www23kkk456ll2k4j5n55b')
print(ret) # ['23k', '456', '55b']
pattern = re.compile(r'\d{2}\w')
ret = pattern.findall('www23kkk456ll2k4j5n55b',4,12)
print(ret) # ['456']
1.3、匹配单个字符
单字符匹配:
1、点.:
点号可以代替除了换行符(\n)以外的任何一个字符;
2、[]:
匹配[]中列举的字符;
3、\d:
匹配数字;
4、\D:
匹配非数字;
5、\s:
匹配空白、空格、tab键;
6、\S:
匹配非空白;
7、\w:
匹配单词字符;
8、\W:
匹配非单词字符;
ret = re.match(r'速度与激情.','速度与激情')
print(ret.group() if ret else '没有匹配数据') # 没有匹配数据
ret = re.match(r'速度与激情.','速度与激情1')
print(ret.group() if ret else '没有匹配数据') # 速度与激情1
ret = re.match(r'速度与激情.','速度与激情A')
print(ret.group() if ret else '没有匹配数据') # 速度与激情A
ret = re.match(r'速度与激情.','速度与激情!')
print(ret.group() if ret else '没有匹配数据') # 速度与激情!
1.4、匹配多个字符
1、*
匹配前一个字符出现>=0次
2、+
匹配前一个字符出现>=1次
3、?
匹配前一个字符出现1次或者0次
4、{m}
匹配前一个字符出现m次
5、{m,n}
匹配前一个字符出现m到n次
ret = re.match('[A-Za-z]*','Ww')
print(ret.group() if ret else '没有匹配数据') # Ww
ret = re.match('[A-Za-z]+','WwwW')
print(ret.group() if ret else '没有匹配数据') # WwwW
ret = re.match('[A-Za-z]?','MmMm')
print(ret.group() if ret else '没有匹配数据') # M
网友评论