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