Python正则表达式

前言

前文介绍了正则表达式的定义和使用方法,今天我们就正式讲解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))

# <re.Match object; span=(0, 6), match='Welcom'>
# 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))

#<re.Match object; span=(0, 6), match='Welcom'>
# <re.Match object; span=(7, 9), match='to'>
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标签中。

所以,我们的正则表达式写成下面的样子

<h2>(.*?)</h2>

最终的代码如下:

import requests
import re

url = 'https://www.qiushibaike.com/text/'
res = requests.get(url)
names = re.findall("<h2>(.*?)</h2>",res.text,re.S)
print(names)

学到这里,我希望读者可以举一反三,把这个爬虫代码完善哦~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值