鱼C论坛

 找回密码
 立即注册
查看: 1448|回复: 1

[技术交流] python爬虫——正则表达式

[复制链接]
发表于 2021-10-24 15:22:52 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

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

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

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

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

  12. print(re_list)

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


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

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

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

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

  17. print(re_list)
复制代码

每个人的信息将会以元组的形式,一起存放到一个列表中
  1. [('高文烨', '8岁', '中心小学三年级', '广泛,跳舞、唱歌、运动'), ('高伟', '6岁', '中心小学三年级', '广泛,篮球、散步、跳'), ('高文', '7岁', '中心小学三年级', '广泛,跳舞、唱、上网'), ('高烨', '5岁', '中心小学三年级', '广泛,舞、唱歌'), ('文烨', '8岁', '中心小学三年级', '广泛,跳、运动'), ('叶烨', '8岁', '中心小学三年级', '广泛,、歌、游戏')]
复制代码

网页中,相同的类型的内容,都是以统一的格式存在网页上的
例如电影天堂网里
捕获.PNG 1.PNG

上面知道了正则表达式的用法,现在来看看正则表达式里各种字符用法。
正则表达式元字符
1) 元字符
正则表表达式元字符
元字符匹配内容
a, X, 9, <普通字符完全匹配。
.匹配除换行符以外的任意字符
\w匹配所有普通字符(数字、字母或下划线)[A-Za-z0-9_]
\s匹配任意的空白符[\t\r\n\f]
\d匹配数字[0-9]
\n匹配一个换行符
\t匹配一个制表符
\b匹配一个单词的结尾
^匹配字符串的开始位置.例如:^Python  在字符串或内部行的开头匹配“Python”
$匹配字符串的结尾位置。例如:Python$ 在字符串或内部行的结尾匹配“Python”
\W匹配非字母或数字或下划线[A-Za-z0-9_]
\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) 字符组
有时也会出现各种字符组成的字符组,这在正则表达式中使用[]表示,如下所示:

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

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

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

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


正则表达式转义

如果使用正则表达式匹配特殊字符时,则需要在字符前加\表示转意。常见的特殊字符如下:
  1. * + ? ^ $ [] () {} | \
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-10-25 08:07:03 From FishC Mobile | 显示全部楼层
可邢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-28 15:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表