位置: 编程技术 - 正文

python爬虫入门教程--正则表达式完全指南(五)(python爬虫入门教程)

编辑:rootadmin

推荐整理分享python爬虫入门教程--正则表达式完全指南(五)(python爬虫入门教程),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:python爬虫自学系列,python爬虫入门教程非常详细,python爬虫:入门+进阶,python爬虫入门教程pdf,python爬虫入门教程pdf,python爬虫入门教程,python爬虫入门教程pdf,python爬虫教程,内容如对您有帮助,希望把文章链接给更多的朋友!

前言

正则表达式处理文本有如疾风扫秋叶,绝大部分编程语言都内置支持正则表达式,它应用在诸如表单验证、文本提取、替换等场景。爬虫系统更是离不开正则表达式,用好正则表达式往往能收到事半功倍的效果。

介绍正则表达式前,先来看一个问题,下面这段文本来自豆瓣的某个网页链接,我对内容进行了缩减。问:如何提取文本中所有邮箱地址呢?

如果你还没接触过正则表达式,我想对此会是一筹莫展,不用正则,似乎想不到一种更好的方式来处理,不过,我们暂且放下这个问题,待学习完正则表达式之后再来考虑如何解决。

字符串的表现形式

Python 字符串有几种表现形式,以u开头的字符串称为Unicode字符串,它不在本文讨论范围内,此外,你应该还看到过这两种写法:

前者是常规字符串,后者 r 开头的是原始字符串,两者有什么区别?因为在上面的例子中,它们都是由普通文本字符组成的串,在这里没什么区别,下面可以证明

但是,如果字符串中包括有特殊字符,会是什么情况呢?再来看一个例子:

"n" 是一个转义字符,它在 ASCII 中表示换行符。而 r"n" 是一个原始字符串,原始字符串不对特殊字符进行转义,它就是你看到的字面意思,由 "" 和 "n" 两个字符组成的字符串。

定义原始字符串可以用小写r或者大写R开头,比如 r"b" 或者 R"b" 都是允许的。在 Python 中,正则表达式一般用原始字符串的形式来定义,为什么呢?

举例来说,对于字符 "b" 来说,它在 ASCII 中是有特殊意义的,表示退格键,而在正则表达式中,它是一个特殊的元字符,用于匹配一个单词的边界,为了能让正则编译器正确地表达它的意义就需要用原始字符串,当然也可以使用反斜杠 "" 对常规定义的字符串进行转义

正则基本介绍

正则表达式由普通文本字符和特殊字符(元字符)两种字符组成。元字符在正则表达式中具有特殊意义,它让正则表达式具有更丰富的表达能力。例如,正则表达式 r"a.d"中 ,字符 'a' 和 'd' 是普通字符,'.' 是元字符,. 可以指代任意字符,它能匹配 'a1d'、'a2d'、'acd' ,它的匹配流程是:

Python 内置模块 re 是专门用于处理正则表达式的模块。

如果原文本字符串与正则表达式匹配,那么就会返回一个 Match 对象,当不匹配时,match 方法返回的 None,通过判断m是否为None可进行表单验证。

接下来,我们需要学习更多元字符。

基本元字符

.:匹配除换行符以外的任意一个字符,例如:"a.c" 可以完全匹配 "abc",也可以匹配 "abcef" 中的 "abc" : 转义字符,使特殊字符具有本来的意义,例如: 1.2 可以匹配 1.2 [...]:匹配方括号中的任意一个字符,例如:a[bcd]e 可以匹配 abe、ace、ade,它还支持范围操作,比如:a到z可表示为 "a-z",0到9可表示为 "0-9",注意,在 "[]" 中的特殊字符不再有特殊意义,就是它字面的意义,例如:[.*]就是匹配 . 或者 * [^...],字符集取反,表示只要不是括号中出现的字符都可以匹配,例如:a[^bcd]e 可匹配 aee、afe等 python爬虫入门教程--正则表达式完全指南(五)(python爬虫入门教程)

group 方法返回原字符串(abcef)中与正则表达式相匹配的那部分子字符串(abc),提前是要匹配成功 match 方法才会返回 Match 对象,进而才有group方法。

预设元字符

w 匹配任意一个单词字符,包括数字和下划线,它等价于 [A-Za-z0-9_],例如 awc 可以匹配 abc、acc W 匹配任意一个非单词字符,与 w 操作相反,它等价于 [^A-Za-z0-9_],例如: aWc 可匹配 a!c s 匹配任意一个空白字符,空格、回车等都是空白字符,例如:asc 可以配 anc,这里的 n表示回车 S 匹配任意一个非空白字符 d 匹配任意一个数字,它等价于[0-9],例如:adc 可匹配 a1c、a2c ... D 匹配任意一个非数字

边界匹配

边界匹配相关的符号专门用于修饰字符。

^ 匹配字符的开头,在字符串的前面,例如:^abc 表示匹配 a开头,后面紧随bc的字符串,它可以匹配 abc $ 匹配字符的结尾,在字符串的末尾位置,例如: hello$

重复匹配

前面的元字符都是针对单个字符来匹配的,如果希望匹配的字符重复出现,比如匹配身份证号码,长度位,那么就需要用到重复匹配的元字符

* 重复匹配零次或者更多次 &#; 重复匹配零次或者一次 + 重复匹配1次或者多次 {n} 重复匹配n次 {n,} 重复匹配至少n次 {n, m} 重复匹配n到m次

逻辑分支

匹配一个固定电话号码,不同地区规则不一样,有的地方区号是3位,电话是8位,有的地方区号是4位,电话为7位,区号与号码之间用 - 隔开,如果应对这样的需求呢?这时你需要用到逻辑分支条件字符 |,它把表达式分为左右两部分,先尝试匹配左边部分,如果匹配成功就不再匹配后面部分了,这是逻辑 "或" 的关系

0d{2}-d{8}|0d{3}-d{7} 表达式以0开头,既可以匹配3位区号8位号码,也可以匹配4位区号7位号码

分组

前面介绍的匹配规则都是针对单个字符而言的,如果想要重复匹配多个字符怎么办,答案是,用子表达式(也叫分组)来表示,分组用小括号"()"表示,例如 (abc){2} 表示匹配abc两次, 匹配一个IP地址时,可以使用 (d{1,3}.){3}d{1,3},因为IP是由4组数组3个点组成的,所有,前面3组数字和3个点可以作为一个分组重复3次,最后一部分是一个1到3个数字组成的字符串。如:..0.1。

关于分组,group 方法可用于提取匹配的字符串分组,默认它会把整个表达式的匹配结果当做第0个分组,就是不带参数的 group() 或者是 group(0),第一组括号中的分组用group(1)获取,以此类推

通过分组,我们可以从字符串中提取出想要的信息。另外,分组还可以通过指定名字的方式获取。

贪婪与非贪婪

默认情况下,正则表达式重复匹配时,在使整个表达式能得到匹配的前提下尽可能匹配多的字符,我们称之为贪婪模式,是一种贪得无厌的模式。例如: r"a.*b" 表示匹配 a 开头 b 结尾,中间可以是任意多个字符的字符串,如果用它来匹配 aaabcb,那么它会匹配整个字符串。

有时,我们希望尽可能少的匹配,怎么办?只需要在量词后面加一个问号" ?",在保证匹配的情况下尽可能少的匹配,比如刚才的例子,我们只希望匹配 aaab,那么只需要修改正则表达式为 r"a.*&#;b"

非贪婪模式在爬虫应用中使用非常频繁。比如之前在公众号「Python之禅」曾写过一篇爬取网站并将其转换为PDF文件的场景,在网页上涉及img标签元素是相对路径的情况,我们需要把它替换成绝对路径

sub 函数可以接受一个函数作为替换目标对象,函数返回值用来替换正则表达式匹配的部分,在这里,我把整个img标签定义为一个正则表达式 r'',group() 返回的值是 <img src="/images/category.png"> ,而 group(1) 的返回值是 /images/category.png,最后,我用 replace 方法把相对路径替换成绝对路径。

到此,你应该对正则表达式有了初步的了解,现在我想你应该能解决文章开篇提的问题了。

正则表达式的基本介绍也到这里告一段落,虽然代码示例中用了re模块中的很多方法,但我还没正式介绍该模块,考虑到文章篇幅,我把这部分放在下篇,下篇将对re的常用方法进行介绍。

总结

标签: python爬虫入门教程

本文链接地址:https://www.jiuchutong.com/biancheng/372375.html 转载请保留说明!

上一篇:python爬虫入门教程--HTML文本的解析库BeautifulSoup(四)(python爬虫全套教程)

下一篇:Perl的Mail::POP3Client模块和Gmail通信实例

  • 个人股权转让如何纳税
  • 税收优惠指什么
  • 投资性房地产发生减值迹象均要计提减值准备
  • 水利基金申报表减除项填什么
  • 公允价值下降属于资产吗
  • 销项负数发票是代表交易没有成功吗?
  • 累计折旧空运直接计入生产成本吗
  • 离职补偿金入账
  • 一般纳税人利润100万要交多少税
  • 企业未按规定取得发票如何处理
  • 固定资产未到期报废进项税额需要转出吗
  • 出售使用过的生产设备
  • 技术转让收入是指当事人履行
  • 减少实收资本会引起资产和所有者权益发生变化吗
  • 收到公司of
  • 企业所得税税负怎么算
  • 个体户发放现金工资税务局认可吗
  • 设备销售并负责安装税率是多少
  • 餐饮行业纳税指引及营改增后税负变化!
  • 小规模纳税人申报纳税详细流程
  • 更正申报增值税会产生滞纳金吗
  • 采购原材料未收到发票的会计分录
  • 销项税额抵减会取得专用发票吗为什么
  • 以前年度利润和当年净利润
  • 财务中不能冲销的凭证
  • 企业所得税汇算清缴扣除比例
  • 应收利息和应计利息有什么不同
  • 鸿蒙系统字体不太好看
  • PHP:apache_get_version()的用法_Apache函数
  • 建筑行业怎么做职业生涯规划
  • 盒装cpu和散装
  • 清算期间会计科目
  • php和ajax用哪个调用数据
  • php语句和php变量都是区分大小写的
  • springboot+vue+elementsUI 实现分角色注册登录界面
  • 工业企业制造费用核算范围
  • 购入固定资产如何折旧
  • 二手房印花税怎么算2020
  • 股权变更怎么缴纳个人所得税
  • 资产减值损失会影响营业利润吗
  • cuda版本更新
  • arthas常用命令
  • 批发企业商品盘点发生短缺时
  • php写json
  • 微信支付php代码
  • 扶贫小额信贷分析报告
  • 企业销售旧车增值税处理
  • 普通发票作废要做账吗
  • 帝国cms标题生成图片
  • 收入少收钱账务处理
  • 残保金滞纳金可以税前扣除吗
  • 货物搬运费会计科目
  • 税前弥补以前年度亏损对递延所得税影响
  • 公司为非本单位缴纳社保
  • 以前年度计提的存货跌价准备本年销售了
  • 主营业务成本的摘要怎么写
  • 负数发票怎样做账
  • 印花税征税对象是什么
  • 发票上的折扣是什么意思
  • 上家失控发票补税补不起
  • 借资本公积贷递延所得税负债是什么意思
  • 已抵扣的进项税额转出怎么做会计分录
  • 税交多了可以退吗
  • sql server 数据库日志不可用
  • debian9.6安装教程
  • sql server的数据库
  • sql语句相似度计算
  • 跨网段加入域配置
  • winpsd.exe - winpsd是什么进程
  • linux日志内容
  • jquery validate demo 基础
  • js内置对象方法有哪些
  • unity 3d脚本编程
  • JavaScript中的数据类型分为两大类
  • 2000元工资交多少党费
  • 广东增值税电子专用发票
  • 国税 地税比例
  • 办理税务需要开户许可证吗
  • 为什么进了网页不能登录
  • 西安市个税证明去哪里打印
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设