介绍
对于xpath和bs4不能匹配的数据,可以用正则表达式。正则表达式可以用于匹配复杂的数据,获取目标数据。
match方法
语法:match(正则表达式, 字符串)方法:
- 参数1是匹配的正则表达式书写规则;
- 参数2是从这个字符串中查询匹配;
- 从第一个字符开始匹配,参数1表达式第一个字符必须匹配;
- 只匹配一次;
- 匹配成功,返回结果是正则对象;匹配失败,返回None;
- 使用
.group()获取匹配内容;
实例代码:
python
# 注意:需要导入re模块
import re
# 匹配到结果
s1 = 'python java css html'
res = re.match('python', s1).group()
print(res)
# 匹配不到结果
s1 = 'C++ python java css html'
# 因为匹配规则开头是python,但是匹配的字符不是以python开始的,所以无法匹配到结果
res = re.match('python', s1).group()
print(res)
search方法
语法:search(正则表达式, 字符串)方法:
- 参数1是匹配的正则表达式书写规则;
- 参数2是从这个字符串中查询匹配;
- 不重头开始开始匹配,参数1表达式不一定必须匹配;
- 只匹配一次;
- 匹配成功,返回结果是正则对象;匹配失败,返回None;
- 使用
.group()获取匹配内容;
总结:search和match不同的是,不重头开始匹配。
findall方法
- 参数1是匹配的正则表达式书写规则;
- 参数2是从这个字符串中查询匹配;
- 匹配多次,不限位置;
- 返回值是列表;
- 使用下标取值;
正则规则
. : 表示除了换行符之外,任意一个字符;
* : 表示前面的表达式出现一次或任意次;(尽可能多匹配)
? : 表示前面的表达式出现0次或1次;(尽可能少匹配)
\d : 表示匹配一个数字
\ : 转义字符
贪婪匹配和非贪婪匹配
贪婪匹配:.*
非贪婪匹配:.*?
示例代码:
python
# 贪婪匹配:.*
s1 ='<div>几个字符</div><a href="https://www.baidu.com"></a><div>Python</div>'
res = re.search('<div>.*</div>', s1).group()
print(res) # <div>几个字符</div><a href="https://www.baidu.com"></a><div>Python</div>
# 非贪婪匹配:.*?
s1 ='<div>几个字符</div><a href="https://www.baidu.com"></a><div>Python</div>'
res = re.search('<div>.*?</div>', s1).group()
print(res) # <div>几个字符</div>
分组
分组,也叫二次提取。使用括号包裹正则表达式,第一个括号包裹的方法是 .group(1) ,以次类推。
示例代码:
python
# 分组,二次提取数据
s1 ='<div>几个字符</div><a href="https://www.baidu.com"></a><div>Python</div>'
res = re.search('<div>(.*)</div><a href="(.*)">.*</a>', s1)
g1 = res.group(1)
g2 = res.group(2)
print(g1) # 几个字符
print(g2) # https://www.baidu.com
正则表达式默认不能匹配换行,如果需要匹配换行,可以在match方法或findall方法中添加第三个参数:re.S
python
import re
re.match('正则表达式', '字符串', re.S)
re.findall('正则表达式', '字符串', re.S)