非凡 发表于 2021-10-24 15:22:52

python爬虫——正则表达式

本帖最后由 非凡 于 2021-10-25 14:25 编辑

正则表达式(regular expression)是一种字符串匹配模式或者规则,它可以用来检索、替换那些符合特定规则的文本。
说直白一点正则标答式可以理解为,我们在一串字符串里,通过设置一定的格式来匹配到我想要的内容
举个简单的例子,我从一个同学的自我介绍里,要获取到名字、年龄、年纪、爱好等信息。
#引入re模块
import re

brie = '''大家好!我叫高文烨,8岁,我是中心小学三年级的学生。我的爱好广泛,跳舞、唱歌、运动 都是我喜欢的项目,但我最喜欢看书,是个小书迷。
'''

# 定义一个正则表达式去匹配,获取自己想要的信息。(.*?)所在的位置就是我们想要的内容。
#可以这样理解下面这正则表达式“我叫”的后面接的是姓名所以我们要把“我叫”后面到“,”的内容截取出来。后面会详细介绍(.*?)的作用。
pat = '大家好!我叫(.*?),(.*?),我是(.*?)的学生。我的爱好(.*?) 都是我喜欢的项目.'

#创建正则表达式对象
pattern = re.compile(pat)
#将正则表达式去匹配brie元素,提取想要信息
re_list = pattern.findall(brie)

print(re_list)

[('高文烨', '8岁', '中心小学三年级', '广泛,跳舞、唱歌、运动')]


一条正则表达式在一串字符里,是通过遍历方式去匹配所有内容的。假设所有人的自我介绍都是用同样的格式去介绍自己,就可以将所有人的自我介绍关键信息截取出来。
#引入re模块
import re

brie = '''
大家好!我叫高文烨,8岁,我是中心小学三年级的学生。我的爱好广泛,跳舞、唱歌、运动 都是我喜欢的项目。
大家好!我叫高伟,6岁,我是中心小学三年级的学生。我的爱好广泛,篮球、散步、跳 都是我喜欢的项目,但我最喜欢看书,是个小书迷。
大家好!我叫高文,7岁,我是中心小学三年级的学生。我的爱好广泛,跳舞、唱、上网 都是我喜欢的项目,但我最喜欢看书,是个小书迷。
大家好!我叫高烨,5岁,我是中心小学三年级的学生。我的爱好广泛,舞、唱歌 都是我喜欢的项目,但我最喜欢看书,是个小书迷。
大家好!我叫文烨,8岁,我是中心小学三年级的学生。我的爱好广泛,跳、运动 都是我喜欢的项目,但我最喜欢看书,是个小书迷。
大家好!我叫叶烨,8岁,我是中心小学三年级的学生。我的爱好广泛,、歌、游戏 都是我喜欢的项目,但我最喜欢看书,是个小书迷。
'''

# 定义一个正则表达式去匹配,获取自己想要的信息
pat = '大家好!我叫(.*?),(.*?),我是(.*?)的学生。我的爱好(.*?) 都是我喜欢的项目'

#创建正则表达式对象
pattern = re.compile(pat)
#将正则表达式去匹配brie元素,提取想要信息
re_list = pattern.findall(brie)

print(re_list)
每个人的信息将会以元组的形式,一起存放到一个列表中
[('高文烨', '8岁', '中心小学三年级', '广泛,跳舞、唱歌、运动'), ('高伟', '6岁', '中心小学三年级', '广泛,篮球、散步、跳'), ('高文', '7岁', '中心小学三年级', '广泛,跳舞、唱、上网'), ('高烨', '5岁', '中心小学三年级', '广泛,舞、唱歌'), ('文烨', '8岁', '中心小学三年级', '广泛,跳、运动'), ('叶烨', '8岁', '中心小学三年级', '广泛,、歌、游戏')]
网页中,相同的类型的内容,都是以统一的格式存在网页上的
例如电影天堂网里


上面知道了正则表达式的用法,现在来看看正则表达式里各种字符用法。
正则表达式元字符
1) 元字符
正则表表达式元字符

元字符         匹配内容
a, X, 9, <         普通字符完全匹配。
.         匹配除换行符以外的任意字符
\w         匹配所有普通字符(数字、字母或下划线)
\s         匹配任意的空白符[\t\r\n\f]
\d         匹配数字
\n         匹配一个换行符
\t         匹配一个制表符
\b         匹配一个单词的结尾
^         匹配字符串的开始位置.例如:^Python在字符串或内部行的开头匹配“Python”
$         匹配字符串的结尾位置。例如:Python$ 在字符串或内部行的结尾匹配“Python”
\W         匹配非字母或数字或下划线
\D         匹配非数字[^0-9]
\S         匹配非空白符[^\t\r\n\f]
a|b         匹配字符 a 或字符 b
()         正则表达式分组所用符号,匹配括号内的表达式,表示一个组。
[...]        匹配字符组中的字符
[^...]         匹配除了字符组中字符的所有字符

2) 量词

正则表达式量词

量词         用法说明
*         重复零次或者更多次。例如:ruby* 匹配“rub”加上0个以上的y
+         重复一次或者更多次。例如:ruby+ 匹配“rub”加上1个或更多的y
?         重复0次或者一次。例如:ruby? 匹配“rub”或“ruby”:y是可选的
{n}         重复n次。例如:\d{3} 完全匹配3位数
{n,}         重复n次或者更多次。例如:\d{3,} 匹配3位或更多位数字
{n,m}         重复n到m次。例如:\d{3,5} 匹配3,4或5位数

3) 字符组
有时也会出现各种字符组成的字符组,这在正则表达式中使用[]表示,如下所示:

正则表达式字符组

正则         待匹配字符        匹配结果        说明
        8        True        在一个字符组里枚举所有字符,字符组里的任意一个字符和"待匹配字符"相同都视为可以匹配。
        a        False        由于字符组中没有 "a" 字符,所以不能匹配。
        7        True        也可以用-表示范围, 就和 是一个意思。
        s        True        同样的如果要匹配所有的小写字母,直接用 就可以表示。
        B        True        就表示所有的大写字母。
        e        True        可以匹配数字,大小写形式的 a~f,用来验证十六进制字符。
ython                 Python        True        匹配“Python”或“python”
rub         ruby         True         匹配“ruby”或“rube”
[^0-9]         7        False        匹配数字以外的任何东西

贪婪模式非贪婪模式
正则表达式默认为贪婪匹配,也就是尽可能多的向后匹配字符,比如 {n,m} 表示匹配前面的内容出现 n 到 m 次(n 小于 m),在贪婪模式下,首先以匹配 m 次为目标,而在非贪婪模式是尽可能少的向后匹配内容,也就是说匹配 n 次即可。

贪婪模式转换为非贪婪模式的方法很简单,在元字符后添加“?”即可实现,如下所示:

非贪婪模式

元字符(贪婪模式)        非贪婪模式
*        *?
+        +?
?        ??
{n,m}        {n,m}?


正则表达式转义
如果使用正则表达式匹配特殊字符时,则需要在字符前加\表示转意。常见的特殊字符如下:
* + ? ^ $ [] () {} | \

一只小肥仔丶 发表于 2021-10-25 08:07:03

可邢
页: [1]
查看完整版本: python爬虫——正则表达式