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))

# 
# 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)

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

你可能感兴趣的:(Python正则表达式)