前言
前文介绍了正则表达式的定义和使用方法,今天我们就正式讲解Python中是如何使用正则表达式的,最后,通过一个简单的正则表达式运用,爬取网络中的网页数据。
re库使用
在Python中使用正则表达式,需要re这个第三方库,这个库是python自带的,不需要自己安装。
re库中有很多函数方法供我们使用,我们就一一简单介绍下使用方法。
match函数
从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match就返回none。
re.match(pattern, string, flags=0)
- pattern:匹配的正则表达式
- string:匹配的字符串
- flags:标志位,用于控制正则表达式的匹配方式
其实flags就是我们前文中说的可选标记(修饰符),如果需要使用多个修饰符,可以通过按位 OR(|) 它们来指定。如 re.I | re.M 被设置成 I 和 M 标志。
我们来看下案例:
import re
text = 'Welcom to Wuhan'
print(re.match('welcom',text,re.I))
print(re.match('welcom',text,re.I).group())
print(re.match('welcom',text,re.I).span())
print(re.match('to',text))
#
# Welcom
# (0, 6)
# None
该函数返回的是个对象(包括匹配的子字符串和在句中的位置索引),如果只需要子字符串,需要用 group() 函数,索引用span()函数。
search函数
不同于match函数,search函数扫描整个字符串并返回第一个成功的匹配。
re.search(pattern, string, flags=0)
import re
text = 'Welcom to Wuhan'
print(re.search('welcom',text,re.I))
print(re.search('to',text))
#
#
findall函数
这个函数是我们经常要使用的函数,使用率极高,他在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。
findall(pattern, string, flags=0)
import re
text = '123abc456dfg'
result = re.findall("\d+", text)
print(result)
# ['123', '456']
finditer函数
和 findall 类似,在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回。
re.finditer(pattern, string, flags=0)
import re
text = '123abc456dfg'
result = re.finditer("\d+", text)
for i in result:
print(i.group())
# 123
# 456
sub函数
将符合的匹配项替换成其他的字符串。
re.sub(pattern, repl, string, count=0, flags=0)
import re
text = '123abc456dfg'
result = re.sub("\d+", '---', text)
print(result)
# ---abc---dfg
split函数
split 方法按照能够匹配的子串将字符串分割后返回列表。
re.split(pattern, string[, maxsplit=0, flags=0])
import re
text = '123abc456dfg'
result = re.split("\d+", text)
print(result)
# ['', 'abc', 'dfg']
compile函数
这个函数会返回一个正则表达式( Pattern )对象,供其他函数使用。多次使用某个正则表达式时推荐使用正则对象Pattern 以增加复用性。
import re
text = '123abc456dfg'
pattern = re.compile("\d+")
result = pattern.findall(text)
print(result)
# ['123', '456']
爬虫小案例
其实我们在爬虫时,用的最多的就是findall函数,我们以糗事百科的段子为例(https://www.qiushibaike.com/text/)。
我们需要获取每个发段子的用户名称,我们打开网页的源代码,可以发现所有的用户名称都在h2标签中。
所以,我们的正则表达式写成下面的样子
(.*?)
最终的代码如下:
import requests
import re
url = 'https://www.qiushibaike.com/text/'
res = requests.get(url)
names = re.findall("(.*?)
",res.text,re.S)
print(names)
学到这里,我希望读者可以举一反三,把这个爬虫代码完善哦~