上图施工计划,已完成专题:

1.数字专题

2.字符串专题

3.列表专题

4.流程控制专题

5.编程风格专题

6.函数使用专题

7.面向对象编程(上篇)

8.面向对象编程(下篇)

9.Python基础9之数据结构(上)

10.Python基础9之数据结构(下)

11.Python基础10之类、包、模块

正则使用需要掌握的主要知识,整篇文章的结构总结如下:

  • 1 学习正则的价值

  • 2 正则学习前的几个准备

    • Q1 字符 `r`是干啥的?

    • Q2 什么是一个原子操作?

    • Q3 怎么理解正则中的转义?

  • 3 掌握最常用规则

    • 情况1:最普通查找

    • 情况2:使用通用字符

    • 情况3:使用元字符

  • 4 有个棘手的场景

  • 5 学会提取子串的技能

  • 6 使用捕获的注意事项

1 学习正则的价值

正则应用广泛。不仅在Python语言中使用,其他语言也都在用,并且不同语言间的正则语法极为相似。同时主流操作系统,尤其linux系统的命令窗口中,也会经常使用到正则。还有,Python的常用包如Pandas,也经常遇到正则。

不仅使用广泛,正则功能也很强大,还有书写简便,因此这项技能值得我们仔细研究和掌握。

2 正则学习前的几个准备

Q1 字符 r是干啥的?

经常见过正则表达式前有一个字符 r,它的作用是告诉解释器后面的一串是原生字符串,按照字面意思解释即可。如:

r'\n.*'

它告诉编译器s串第一个字符是\,第二个字符是n.打印的结果就是它本身:

\n.*

而如果不带前缀字符r,即:

'\n.*'

解释器认为前两个字符\n为转义字符,一个新行的意思,打印结果为一个换行加.*,如下所示:

.*

Q2 什么是一个原子操作?

微观世界中,如果定义原子是组成事物的最基本单元,那么就可理解为原子不能再分了。同理此处,正则的原子操作是指不能再被分割的正则表达式操作。

如正则中的+指前面的一个原子操作出现至少1次。例如:66+表示第一个字符为6,第二个字符6和第三个字符+联合起来表示至少出现1次字符6,因此综合起来至少要有2个6紧邻的串才能满足此正则表达式(下面会详细讲到)。

\w+表示字母数字下划线中的任意一个字符(\w指代的)至少出现1次,那么\w就是一个原子操作。

因此,普通字符是原子,正则中的通用字符(下面会讲到)也是原子。大家记住原子这个概念。

Q3 怎么理解正则中的转义?

正则世界中,重新定义了几个新的转义字符。

一个转义字符\+一个字符,转义后会改变原字符的意义,它不再是它,而是赋予一个新的含义。

例如,w本身就是一个英文字符w,没有其他任何含义。但是,前面加一个转义字符 \后,含义发生重大改变,w它不再是w,而是\要与w连在一起,被解释器解释为匹配以下字符集合中的任意一个:

'\w'

等于:

pat = '[0123456789      AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz      _]'

即匹配数字、大小写字母和下划线_字符集合中的任意一个。

你看,一个通用转义字符\w直接就指代上面这一大串,写法多么简便,同时在正则的世界里又经常被用到,故被称为:通用正则字符

类似的通用正则字符还有几个,下面也会讲到。做一件事前,把规则弄清,触类旁通,相信大家理解其他几个也没问题。

3 掌握最常用规则

为了更清晰的展示,咱们只涉及最常用的规则,一来缩短篇幅,二来降低大家学习曲线,三来一类问题掌握一个,触类旁通即可。

情况1:最普通查找

最普通查找就是需要找啥就写啥,没有使用正则的规则。如下是关于小说《灿烂千阳》中的一段话,从中找出单词friendship,可能出现多次:

s = """# Mariam is only fifteen # when she is sent to Kabul to marry the troubled and bitter Rasheed,# who is thirty years her senior. # Nearly two decades later, # in a climate of growing unrest, tragedy strikes fifteen-year-old Laila, # who must leave her home and join Mariam's unhappy household. # Laila and Mariam are to find consolation in each other, # their friendship to grow as deep as the bond between sisters, # as strong as the ties between mother and daughter. # With the passing of time comes Taliban rule over Afghanistan, # the streets of Kabul loud with the sound of gunfire and bombs, # life a desperate struggle against starvation, brutality and fear, # the women's endurance tested beyond their worst imaginings. # Yet love can move a person to act in unexpected ways, # lead them to overcome the most daunting obstacles with a startling heroism. # In the end it is love that triumphs over death and destruction. # A Thousand Splendid Suns is an unforgettable portrait of a wounded country and#  a deeply moving story of family and friendship. #  It is a beautiful, heart-wrenching story of an unforgiving time, #  an unlikely bond and an indestructible love."""

使用正则前,先导入re模块,再定义正则表达式,然后使用findall方法找出所有匹配

import re

以上就是使用正则的最普通例子。如果要找出前缀为grow的单词,比如可能为grows, growing 等,最普通查找实现起来就不方便。

然而,借助于下面介绍的元字符、通用字符和捕获组合起来,便能应对解决复杂的匹配查找问题。

情况2:使用通用字符

在正则的世界里,通用字符指帮助我们更加简便的写出匹配规则的字符。

如上面文字,下面正则匹配串能找出以d开始,[a-z]表示的任意一个小写英文字符,{7}表示小写英文字符出现7次(下面情况3会说到),也就是匹配出来的子串长度为1+7=8:

'd[a-z]{7}'

匹配结果为:

'daughter', 

同理,模式串pat = 'd[a-z]{10}'匹配的结果为:

'destruction', 

模式串pat = 'd[a-z]{11}'匹配的结果为:

'destructible']

你看,通用字符[a-z]使用真方便,5个字符一下就表达了所有26个小写的字符,但是注意[a-z]匹配26个小写字符的任意一个.

类似功能的通用字符还包括:

[A-Z]  匹配大写英文字母[0-9]  匹配一个0-9之间的数字

还有更加强大的通用字符:

\s  匹配空白字符,如\n \t \b等\w  匹配任意字母、数字、下划线 \d  匹配十进制数字0-9

而\S, \W, \D 分别对应 \s, \w, \d匹配字符集的补集,例如\S 的意思是匹配 \s 以外的其他任意字符。

情况3:使用元字符

的含义大家不妨理解为用来描述它后面事物的类,如元类用来创建描述类的类,元模型描述一个模型的模型,因此推而广之,元字符用来描述字符的字符。

理解以上后,你再看正则中使用最普遍的一个元字符 +,它是用来描述前面一个原子出现次数的字符,表示前一个原子出现1次或多次都可。

例如,在寻找手机靓号时,正则表达式66+,表示前一个原子6至少出现1次,因此连上第一个6,表示电话号码中至少有两个66紧邻。因此,电话号码1861265216617566665656都满足要求,而号码18616161616不符合要求。

类似功能的元字符,还包括如下。功能相似,不再赘述:

* 前面的原子重复0次、1次、多次 

4 有个棘手的场景

了解以上规则后,我们能去完成很多匹配任务,比如一些字符串匹配任务;查找某个手机号是不是靓号;找到文字中出现某个模式的所有地方。

但是,使用正则还会经常遇到的一大场景。试想,从一个文件里提取出所有如下格式的链接,并全部导出来:

https://github.com/jackzhenguo/python-small-examples

https://gitbook.cn/gitchat/column/5e37978dec8d9033cf916b5d

截止目前,我们还不能完成这样的匹配任务。鉴于这种匹配任务确实很常见,因此你很有必要学会下面这项技能。

5 学会提取子串的技能

今天以我写过的《Python 60天》专栏中的一段文字,提取出里面的链接为例,阐述提取子串的实用性。

先贴上文字(有删减改动),将这段文字赋值给变量 urls

"""基于 Python 的包更是枝繁叶茂,遍地开花,“Tiobe 编程语言排行榜”最新统计显示 Python 是增长最快的语言。![image-20200131192231967](https://images.gitbook.cn/2020-02-05-014719.png)接下来,与大家,还有远在美国做 AI 博士后研究的 Alicia,一起开始我们的 60 天 Python 探索之旅吧。所有的这些考虑,都是为了让大家在短时间内掌握 Python 技术栈,多一个生存的本领。拿到理想的 Offer 后,早日过上自己想要的生活。让我们开始吧。如下,按照是否为静态/动态语言,弱类型/强类型两个维度,总结常用的语言分类。![image-20200205155429583](https://images.gitbook.cn/2020-02-05-080211.png) ### 四大基本语法"""

你可能很快写出如下的正则表达式:

# 元字符.表示匹配除\n字符外的任意一个字符

然后导入re模块,使用findall方法找出所有匹配:

import re

运行结果显示如下,观察发现2个匹配,但是每个匹配链接都包括冗余字符,因此匹配错误:

'https://images.gitbook.cn/2020-02-05-014719.png)',

我们再稍微优化原正则表达式为:

# 添加 \) 表示待匹配子串以右括号结尾

打印结果显示如下,结果确实好一点,但是依然包括右括号,结果还是错误的:

'https://images.gitbook.cn/2020-02-05-014719.png)', 

所以掌握提取子串的技能就很重要,实现提取子串也很简单,只需把想要返回的子串加上一对括号就行,如下所示:

# 把想要返回的子串外面添加一对括号

此时返回结果完全正确,无任何多余字符。想要返回的子串外面添加一对括号还有个专业叫法:捕获或分组。

6 使用捕获的注意事项

捕获功能非常实用,使用它需要区分一点,贪婪捕获和非贪婪捕获。前者指在满足匹配模式前提下,返回包括尽可能多的字符匹配模式;后者指满足匹配条件下,尽可能少的捕获。

我们伪造一个理想状况下的案例:

htmlContent = """        <div><div><h2>这是二级标题h2>div><div><p> 这是一个段落>/p>div>div>"""

贪心捕获使用(.*),如下所示:

r"
(.*)

"

结果为如下,尽可能长的捕获,而不是遇到第一个

时就终止:

<div>

而非贪心捕获的正则表达式为

(.*?)

",如下:

r"
(.*?)

"

结果为两个元素,遇到第一个

时终止,然后继续捕获出第二子串:

<div>

以上例子仅仅用作演示两者区别,实际的html结构含有换行符等,环境比上面要复杂的多,贪心和非贪心捕获的写法可能不会导致结果不同,但是我们依然需要理解它们的区别。

关注公众号送免费资料
回复Jenkins 领取Jenkins学习资料回复Jmeter 领取Jmeter学习资料

回复Java   领取Java学习资料

回复Python 领取python入门资料

回复RobotFramework   领取RobotFramework 框架搭建资料

你可能会喜欢

  • Jmeter关联系列_数据驱动中的业务逻辑关联

  • docker搭建接口自动化持续集成框架

  • python28:迷宫游戏最短路径算法

  • Python基础11之类和包和模块

  • 神经网络初探4:Tensorflow2.0数据集与神经网络初探

  • 盘一盘 Python 系列基础篇十一之 机器学习 Sklearn

  • 盘一盘 Python 系列特别篇21之:SciPy 稀疏矩阵

  • Linux环境部署之ubuntu网络配置

  • 性能测试指标7:性能测试的阶段性工作

  • jmeter之对jar包进行调用

  • jmeter之爬取网络图片

  • 软件质量保障体系图

  • 研发过程中的测试工作

  • APP测试流程及测试点

  • WEB测试范围小结

测试交流,加我备注【测试交流】拉入交流群,更有不定期资料赠送,敬请期待

本文转载自【Python与算法社区

python正则_Python基础12之Python正则相关推荐

  1. anaconda对应python版本_Python基础——如何查看python版本、如何查看多个python版本

    前言 初学者来说,安装python过程是存在一定难度的. 在安装过程中,可能安装了多个python版本,可能安装了anaconda导致有自带的python,同时本身电脑也安装了官方下载的python也 ...

  2. python 与_Python基础 第一个 Python 程序

    目标 第一个 HelloPython 程序 Python 2.x 与 3.x 版本简介 执行 Python 程序的三种方式 解释器 -- python / python3 交互式 -- ipython ...

  3. 视频教程-快速入门Python基础教程_Python基础进阶视频-Python

    快速入门Python基础教程_Python基础进阶视频 十余年计算机技术领域从业经验,在中国电信.盛大游戏等多家五百强企业任职技术开发指导顾问,国内IT技术发展奠基人之一. 杨千锋 ¥199.00 立 ...

  4. 视频教程-快速入门Python基础教程_Python基础知识大全-Python

    快速入门Python基础教程_Python基础知识大全 十余年计算机技术领域从业经验,在中国电信.盛大游戏等多家五百强企业任职技术开发指导顾问,国内IT技术发展奠基人之一. 杨千锋 ¥99.00 立即 ...

  5. Python学习入门基础教程(learning Python)--5.6 Python读文件操作高级

    前文5.2节和5.4节分别就Python下读文件操作做了基础性讲述和提升性介绍,但是仍有些问题,比如在5.4节里涉及到一个多次读文件的问题,实际上我们还没有完全阐述完毕,下面这个图片的问题在哪呢? 问 ...

  6. c语言实现爬虫功能,用C/C 扩展Python语言_python 调用c语言 python实现简单爬虫功能_python实现简单爬虫...

    用C/C 扩展Python语言 Python是一门功能强大的脚本语言,它的强大不仅表现在功能上,还表现在其扩展性上.她提供大量的API以方便程序员利用C/C++对Python进行扩展.因为执行速度慢几 ...

  7. python定义一个dog类 类属性有名字_python 基础 12 初识类,类方法,类属性

    python 基础 12 初识类,类方法,类属性 # 面向过程 : 想要一个结果 写代码 实现计算结果 # 面向对象开发 : 有哪些角色 角色的属性和技能 两个角色之间是如何交互的 # 复杂的 拥有开 ...

  8. python异常处理_Python基础语法案例(Fibonacci):选择结构、循环结构、异常处理结构、代码优化...

    推荐图书: <Python程序设计基础(第2版)>,ISBN:9787302490562,董付国,清华大学出版社,第16次印刷,清华大学出版社2019年度畅销图书 图书购买链接(京东):配 ...

  9. python的基础_python基础知识,python必背内容,一、python的基

    python基础知识,python必背内容,一.python的基 一.python的基础 1.简单写一行python代码:print('hello,world')print('你好,北京') 2.变量 ...

最新文章

  1. 计算机操作系统第四版习题答案 第一章简答题
  2. 【android-tips】关于android应用R文件无法读取
  3. vb怎么运用api对文件夹进行加密_[MIUI玩法篇 30] | 小米私密文件夹 深度揭秘
  4. 二值化图像去除小黑点_python与图像工程(2020.10.11)
  5. 【BZOJ4771】七彩树 主席树+树链的并
  6. Vue 跨平台性能优化十法
  7. std::cin 溢出_溢出:坦诚地工作与焦虑如何影响我的团队
  8. 数据结构动态顺序字符串基本操作实验_技术连载:数据结构 - 栈
  9. python中索引和下标_Series下标索引、标签索引、切片索引、布尔索引
  10. Linux查看端口被那个进程占用
  11. c语言数据页,c语言基础--数据类型(51页)-原创力文档
  12. Win7系统桌面设置便签与备忘录的方法
  13. 绕过卡巴斯基通过RPC控制lsass注入DLL
  14. HierachyViewer的使用
  15. ppt内嵌excel显示找不到服务器,翻遍互联网都找不到的干货:如何在 PPT 里面演示动态图表?...
  16. [转]外贸出口流程图
  17. 基于STM32H7的ADS1256驱动案例,8通道,24bit ADC,带可编程增益(2021-09-20)
  18. ci发什么音标_单词发[ci]的单词有哪些,音标和中文又是什么?
  19. 【Spark重点难点】你从未深入理解的RDD和关键角色
  20. 为Word文档加水印使其更加美观(转)

热门文章

  1. 选择存储服务器硬盘并解决一些疑问
  2. 终端证书文件批量导入数据库的Python源码
  3. Python遍历列表时删除元素
  4. Codeforces 486D. Valid Sets
  5. ant打包web项目
  6. STM32F103xC、STM32F103xD和STM32F103xE增强型模块框图 与 时钟树
  7. 2020陕西高考全省理科最高分725、文科最高分700
  8. FPGA实验五——多周期移位寄存器
  9. 对于指针传入函数,却最终没有改变指针的值的问题
  10. 渲染到ui_虚幻4渲染编程(UI篇)【第二卷:程序化UI特效-[1]】