正则的作用是在一段文本中匹配满足条件的内容
我们首先定义一种匹配规则,根据这个规则来筛选符合条件的字符串;这就好比我们的find_elements,以及我们的python爬虫遍历列表然后筛选之类的;接下来我们通过几个
例子来介绍正则表达式:
- 常用正则表达式匹配符号
(1)匹配普通字符
re 是python正则表达式库
re.findall根据正则表达式匹配目标字符串内容
import re
re_rule="ab"
string_content="abcdefgabcd"
res=re.findall(re_rule,string_content)
print(res)
# 结果》["ab","ab"]
re_rule是规则
string_content是筛选的字符串
(2)匹配或关系
import re
re_rule="aa|bb"
string_content="aassdfabb"
res=re.findall(re_rule,string_content)
print(res)
# 结果》['aa', 'bb']
(3)匹配单个字符
“ . ”匹配处换行外的任意一个字符
import re
re_rule="张.."
string_content="张淼淼sddddd张冉冉"
res=re.findall(re_rule,string_content)
print(res)
# 结果》['张淼淼', '张冉冉']
张..表示张性三个字的名字..表示的不一定是汉字,字符也可以
(4)匹配字符串重复
“ * ”匹配规则:匹配前面的字符出现0次或者多次
import re
re_rule="wo*"
string_content="woooo——ow"
res=re.findall(re_rule,string_content)
print(res)
# 结果》['woooo', 'w']
因为后面的w的o出现了零次,所以也打印
“ + ”匹配规则:匹配前面的字符出现1次或者多次
import re
re_rule="wo+"
string_content="woooo——ow"
res=re.findall(re_rule,string_content)
print(res)
# 结果》['woooo']
后面的w一次o都没出现,所以不打印
“ ?”匹配规则:匹配前面的字符出现0次或者1次
import re
re_rule="wo?"
string_content="woooo——ow"
res=re.findall(re_rule,string_content)
print(res)
# 结果》['wo', 'w']
“ {n} ”匹配规则:匹配前面的字符出现n次
import re
re_rule="wo{2}"
string_content="woooo——ow"
res=re.findall(re_rule,string_content)
print(res)
# 结果》['woo']
- 贪婪模式和非贪婪模式
贪婪模式(Greedy):尽可能多地匹配字符,直到不能再匹配为止
非贪婪模式(Lazy):尽可能少地匹配字符,只要满足正则表达式的最小要求就停止
# 贪婪模式
import re
re_rule="<.*>"
string_content="<a>example</a><b>text</b>"
res=re.findall(re_rule,string_content)
print(res)
# 结果》['<a>example</a><b>text</b>']
因为.表示一个字符,*表示前面字符出现0次,或者多次;
贪婪模式就是在符合<>结构的条件下,*表示出现多次,就是<>里面的内容尽可能地多
# 非贪婪模式
import re
re_rule="<.*?>"
string_content="<a>example</a><b>text</b>"
res=re.findall(re_rule,string_content)
print(res)
# 结果》['<a>', '</a>', '<b>', '</b>']
非贪婪模式就是在原本的条件中加个?,首先*表示出现了0次或1次【因为要满足<>结构】,?也表示前面的出现了0次或1次,就是在满足了他们的最低条件【距离一个<最近的另一个>】下,不去往里面多添加东西。
- 捕获组
只获取括号里面的正则表达式匹配的内容
import re
re_rule='<a title=".*?" href="(.*?)" target="_blank">.*?</a>'
string_content="""
<div>
<a title="百度" href="www.baidu.com" target="_blank">我是baidu标签内容</a>
<a title="谷歌" href="www.google.com" target="_blank">我是google标签内容</a>
<a title="搜狐" href="www.搜狐.com" target="_blank">我是搜狐标签内容</a>
"""
res=re.findall(re_rule,string_content)
print(res)
# 结果》['www.baidu.com', 'www.google.com', 'www.搜狐.com']
这里就是只捕获了括号内部匹配的内容,其他的均不去匹配。
这个我们通常用于在某个庞大的数据体里面去筛选出我们所需要的信息。