爬虫——re库的使用
1. re库的介绍
-
在python中,re库是一个用于处理正则表达式的库,主要用来处理字符串进行正则表达式的匹配和替换
-
re库是python的标准库,不需要安装
-
导入re库
import re
2. 正则表达式
2.1 基本语法
正则表达式由普通字符和特殊字符(元字符)组成,用于描述和匹配符合特定规则的字符串
2.2 元字符
-
.
匹配除了换行符以外的任意一个字符
正则表达式 a.b 可以匹配"aab",“abb”,"acb"等
-
^
匹配字符串的开头位置
正则表达式 ^bt 可以匹配"btds",“btsd"等,不能匹配"dsbt”
-
$
匹配字符串的结束位置
正则表达式 bt$ 可以匹配"dsbt",“sdbt"等,不能匹配"btds”
-
匹配前面的字符或者组合零个或多个
正则表达式 a*b 可以匹配"b",“ab”,"aab"等
-
匹配前面的字符或者组合一个或多个
正则表达式 a*b 可以匹配"ab",“aab”,“aaab"等,不能匹配"b”
-
?
匹配前面的字符或者组合零个或一个
正则表达式 a?b 只能匹配"b",“ab”
-
[]
匹配括号内的任意一个字符
正则表达式 [ab] 只能匹配"a",“b”
-
[^]
匹配不在括号内的任意一个字符
正则表达式 [ab] 可以匹配"c",“d”,“e"等,不可以匹配"a”,“b”
-
()
将括号内的内容作为一个组合
正则表达式 (ab)* 可以匹配"",“ad”,"abab"等
2.3 量词
正则表达式量词有:*,+,?,{n},{n,},{n,m}
-
*,+,?在前文查看
-
{n}
匹配前面的字符或者组合n次
-
{n,}
匹配前面的字符或者组合至少n次
-
{n,m}
匹配前面的字符或者组合至少n次,至多m次
2.4 转义字符
-
\b
表示单词边界,即一个单词的开头和结尾
-
\B
表示非单词边界
-
\d
匹配数字,等价于[0-9]
-
\D
匹配非数字,等价于[^0-9]
-
\s
匹配空白字符
-
\S
匹配非空白字符
-
\w
匹配非特殊字符,即字母,数字,下划线,汉字
-
\W
匹配特殊字符
-
\n
匹配换行符
-
\r
匹配回车符
-
\t
匹配制表符
-
\v
匹配垂直制表符
-
\f
匹配换页符
3. re库的常用方法
3.1 match()
match方法用于从字符串的开始处进行匹配,匹配成功返回Match对象,否则None
语法格式:
re.match(pattern,string[,flags])
参数:
- pattern:表示模式字符串,即正则表达式
- string:需要匹配的字符串
- flags:表示标志位
标志 | 描述 |
---|---|
re.A 或 re.ASCII | 对于 \w、\W、\b、\B、\d、\D、\s 和 \S 只进行 ASCII 匹配 |
re.I 或re.IGNORECASE | 执行不区分字母大小写的匹配 |
re.M 或 re.MULTILINE | 将 ^ 和 $ 用于包括整个字符串的开始和结尾的每一行(默认情况下,仅适用于整个字符串的开始和结尾处) |
re.S 或 re.DOTALL | 使用(.)字符匹配所有字符,包括换行符 |
re.X 或 re.VERBOSE | 忽略模式字符串中未转义的空格和注释 |
str = """<a href="#" class="html">首页</a>
<a href="#" class="html">人文</a>"""
res = re.match(r'<a href="#" class="html">.*</a>',str)
print(res.group())
#结果为:<a href="#" class="html">首页</a>
res = re.match(r'<a href="#" class="html">人文</a>',str)
print(res)
#结果为:None
3.2 search()
search方法用于从字符串中搜索第一个匹配的值,匹配成功返回Match对象,否则None
语法格式:
re.search(pattern,string[,flags])
参数:
- pattern:表示模式字符串,即正则表达式
- string:需要匹配的字符串
- flags:表示标志位
str = """<a href="#" class="html">首页</a>
<a href="#" class="html">人文</a>"""
res = re.search(r'<a href="#" class="html">人文</a>',str)
print(res.group())
#结果为:<a href="#" class="html">人文</a>
3.3 findall()
findall方法用于从字符串中搜索所有匹配上的值,匹配成功返回列表,否则空列表
语法格式:
re.findall(pattern,string[,flags])
参数:
- pattern:表示模式字符串,即正则表达式
- string:需要匹配的字符串
- flags:表示标志位
str = """<a href="#" class="html">首页</a>
<a href="#" class="html">人文</a>"""
res = re.findall(r'<a href="#" class="html">.*</a>',str)
for i in res:
print(i,end=" ")
# 结果为:<a href="#" class="html">首页</a> <a href="#" class="html">人文</a>
3.4 sub()
sub方法用于将匹配上的字符串替换成指定的字符串,返回替换后的字符串
语法格式:
re.sub(pattern,repl,string[,count][,flags])
参数:
- pattern:表示模式字符串,即正则表达式
- repl:表示要替换的字符串
- string:需要匹配的字符串
- count:表示替换的最大次数,不选的话替换所有的匹配
- flags:表示标志位
str = """<a href="#" class="html">首页</a>
<a href="#" class="html">人文</a>"""
res = re.sub(r'#',"http",str,count=1)
print(res)
# 结果为:<a href="http" class="html">首页</a>
# <a href="#" class="html">人文</a>
3.5 split()
spllit方法用于根据正则表达式分割字符串,返回列表
语法格式:
re.split(pattern,string[,maxsplit][,flags])
参数:
- pattern:表示模式字符串,即正则表达式
- string:需要匹配的字符串
- maxsplit:表示最大分割数
- flags:表示标志位
str = """<a href="#" class="html">首页</a>
<a href="#" class="html">人文</a>"""
res = re.split(r'\n',str)
print(res)
# 结果为:['<a href="#" class="html">首页</a>', '<a href="#" class="html">人文</a>']
3.6 compile()
用于将正则表达式编译成可复用的正则对象,返回一个regex_object对象
当需要多次使用同一个正则表达式时,可以使用compile方法
regex = re.compile(pattern)
re.match(pattern,string[,flags])
#等价于:regex.match(string[,flags])
re.search(pattern,string[,flags])
#等价于:regex.search(string[,flags])
re.findall(pattern,string[,flags])
#等价于:regex.findall(string[,flags])
re.sub(pattern,repl,string[,count][,flags])
#等价于:regex.sub(repl,string[,count][,flags])
re.split(pattern,string[,maxsplit][,flags])
#等价于:regex.split(string[,maxsplit][,flags])
4. Match对象
Match对象包含了匹配值的位置和数据
方法 | 描述 |
---|---|
start() | 返回匹配值的起始位置 |
end() | 返回匹配值的结束位置 |
span() | 返回一个元组,(起始位置,结束位置) |
group() | 返回匹配得到的结果 |
str = """<a href="#" class="html">首页</a>
<a href="#" class="html">人文</a>"""
res = re.match(r'<a href="#" class="html">首页</a>',str)
print(res.start())
print(res.end())
print(res.span())
print(res.group())
"""
结果为:
0
31
(0, 31)
<a href="#" class="html">首页</a>
"""