万叶集 |
---|
🎉 隐约雷鸣,阴霾天空。 🎉 |
🎉 android系统定制开发但盼风雨来,android系统定制开发能留你在此。 🎉 |
前言:
✌ 作者简介: ✌,android系统定制开发大家可以叫我 🐶哈士奇🐶 ,android系统定制开发一位致力于 TFS android系统定制开发赋能的博主 ✌
🏆 CSDNandroid系统定制开发博客专家认证、android系统定制开发新星计划第三季全栈赛道 top_1 、android系统定制开发华为云享专家、android系统定制开发阿里云专家博主 🏆
📫 如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步👀
💬 人生格言:优于别人,并不高贵,真正的高贵应该是优于过去的自己。💬
🔥 如果感觉博主的文章还不错的话,还请👍关注、点赞、收藏三连支持👍一下博主哦
专栏系列(点击解锁) 学习路线指引 知识定位 以浅显易懂的方式轻松入门,让你彻底爱上Python的魅力。 主要围绕多线程编程、正则表达式学习、含贴近实战的项目练习 。 实现日常办公软件的自动化操作,节省时间、提高办公效率。 从实战的角度出发,先人一步,快速转型测试开发工程师。 更新中 更新中 更新中 更新中 更新中 更新中 记录学习及演练过程中遇到的坑,便于后来居上者 三天打鱼,不深入了解原理,只会让你成为脚本小子。 让漏洞复现变得简单,让安全研究者更加专注于漏洞原理本身。 不涉及linux基础,最终案例会偏向于安全加固方向。 [待完结] 2021年9月3日停止更新,转战先知社区等安全社区及小密圈 2021年9月3日停止更新,转战先知社区等安全社区及小密圈 软件测试数据包抓包分析神器 一文学会 fiddle ,学不会倒立吃翔,稀得! 不仅是性能测试神器,更可用于搭建轻量级接口自动化测试框架。 Python实现的自动化测试利器,该篇章仅介绍UI自动化部分。 文档写于2016年,Java实现的UI自动化,仍有借鉴意义。 该工具目前的应用场景已不多,文档已删,为了排版好看才留着。
文章目录
直奔主题,今天我们来学习一下 re 模块的常用函数
。
🐳 findall() 函数
findall 函数使用方法:
findall(pattern, string, [, flags])
pattern:匹配规则,即正则表达式。
string:需要被匹配的字符串。
[, flags]:选填参数,后面会介绍
findall 函数的功能:
查找字符串中所有(非重复)符合正则表达式匹配规则的数据,并返回一个匹配列表
示例如下:
import retest_lotto = "本期彩票结果是:05,08,12,20,21,22,04" # 将一串字符串赋值给变量 test_dataresult = re.findall('(\d+,\d+,\d+,\d+,\d+,\d+,\d+)', test_lotto) # 利用 findall 函数匹配定义好的正则规则(所有的数字)print(result)# >>> 执行结果如下:# >>> ['05,08,12,20,21,22,04']
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
🐳 search() 函数
search 函数使用方法:
search(pattern, string, flags=0)
pattern:匹配规则,即正则表达式。
string:需要被匹配的字符串。
flags:后面会介绍
search 函数的功能:
使用可选标记搜索字符串中第一次出现的符合正则表达式匹配规则的数据。如果匹配成功,则返回匹配对象;如果失败,则返回 None
🐬 group() 与 groups() 的使用
group() 与 groups()
是 re.search()
函数实例化对象所使用的的方法。
- group(number):返回整个匹配对象,或者编号为 number 的特定自组。(之前的章节已经见过了,返回多个组的时候,可通过该方法获取相应的数据)
- groups():返回一个包含所有匹配子组的元组(如果没有匹配成功,则返回一个空元组)
示例如下:
import retest = "My name is Neo"result = re.search('(.*) name is (.*)', test)print(result.groups())# >>> 执行结果如下:# >>> ('My', 'Neo')print(result.group(1))# >>> 执行结果如下:# >>> Myprint(result.group(2))# >>> 执行结果如下:# >>> Neo
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
🐳 split() 正则替换
split 函数使用方法:
split(pattern, string, max=0)
pattern:匹配规则,即正则表达式。
string:需要被匹配的字符串。
max:默认为 0 ,该情况下,则表示匹配所有匹配到的信息。
split 函数的功能:
根据正则表达式的匹配分隔符
,split 函数将字符串分割为列表,然后返回成功匹配的列表分割最多 max 次(默认分割所有匹配成功的位置)。
示例如下:
import redata = "hello world"print(re.split('\W', data))# >>> 执行结果如下:# >>> ['hello', 'world']
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
🐳 match() 函数
match 函数使用方法:
match(pattern, string, max=0)
pattern:匹配规则,即正则表达式。
string:需要被匹配的字符串。
max:默认为 0 ,该情况下,则表示匹配所有匹配到的信息。
match 函数的功能:
尝试使用带有可选的标记的正则表达式的模式来匹配字符串。如果匹配成功,就返回匹配对象;如果失败,就返回 None)。
这是一个官方给予的定义,其实就是
match 函数
只会匹配字符串从头开始的信息。如果匹配成功,就会返回匹配对象;如果匹配失败就睡返回 None。并且这个 match 返回的对象,也可以通过 group() 函数来进行调用。
示例如下:
import redata = "hello world"result = re.match('hello', data)print(result.group())# >>> 执行结果如下:# >>> hello
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
🐳 compile() 函数
compile 函数使用方法:
compile(pattern, flags=0)
pattern:匹配规则,即正则表达式。
flags:默认为 0 .
这里我们会发现,相较于其它函数少了一个 string 参数;先不要关心为什么,先来看看 compile 的功能。
compile 函数的功能:
定义一个匹配规则的对象。之前我们定义的 "pattern" 规则都是一个字符串被传入的,但是 compile 函数会将这个匹配规则的字符串变成一个匹配规则的对象。接下来我们只需要调用这个对象去传入被匹配的字符串就可以匹配出来相应的信息了。
示例如下:
import redata = "My name is Neo i like python"re_obj = re.compile('is (.*?) i')result = re_obj.findall(data)print(result)# >>> 执行结果如下:# >>> ['Neo']
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
🐳 re 模块的额外匹配要求
其实下面这些匹配要求都是一些属性,并且它们实际就是刚刚上文函数的第三个参数。一般情况下使用率并不高,这里只需要了解即可。
属性 | 描述 |
---|---|
re.I、re.IGNORECASE | 不区分大小写的匹配 |
re.L、re.LOCALE | 根据所使用的本地语言环境通过 \w、\W、\s、\S 实现匹配(在Python2.x时代可以理解为通用模式,类似utf-8) |
re.M、re.MULTILINE | ^ 和$ 分别匹配目标字符串中的起始和结尾,而不是严格匹配字符串本身的起始和结尾;使用该属性可以进一步优化 |
re.S、re.DOTALL | . (点号) 通常匹配除了 (换行符) 之外的的所有单个字符;该标记表示 . (点号)能够匹配所有字符(即增加匹配 ) |
re.X、re.VERBOSE | 忽略规则表达式中的空白和注释 |
🐳 综合小练习
以上一章节的 为蓝本,再结合今天章节所讲的内容做一个练习。
定义一个函数,获取一段前端代码中双引号包裹的内容。
定义一个函数,获取该段前端代码中所有的双引号包裹的内容
# coding:utf-8import re"""定义一个函数,获取一段前端代码中双引号包裹的内容。定义一个函数,获取该段前端代码中所有的双引号包裹的内容"""html = ('<div class="s-top-nav" style="display:none;">' '</div><div class="s-center-box"></div>') # 这是前端代码,暂时不用理解是什么意思def get_html_data(html): re_g = re.compile('style="(.*?)"') # 非贪婪模式获取 style 标签的内容 result = re_g.findall(html) return resultdef re_search_get_html(html): re_g = re.compile('="(.+?)"') # 利用 compile 函数,将匹配规则的字符串变成一个匹配规则的对象 result = re_g.search(html) # 使用 search 函数 匹配符合规则的字符串(这里只能匹配一次) return resultif __name__ == '__main__': get_html_data = get_html_data(html) print(get_html_data)# >>> 执行结果如下:# >>> ['display:none;'] re_search_get_html = re_search_get_html(html) print(re_search_get_html.groups()) # 因为使用 re_search_get_html 函数 使用的是 search 方法,所以只能匹配一次# >>> 执行结果如下:# >>> ('s-top-nav',) # 这个情况下,我们就需要知道整个字符串的匹配要求;看一下下面的内容,是否能够匹配到所有的内容。 re_g = re.compile(('<div class="(.*?)" style="(.*?)">' '</div><div class="(.*?)"></div>')) result = re_g.search(html) print(result.groups()) print([result.group(1), result.group(2)]) # >>> 执行结果如下:# >>> ('s-top-nav', 'display:none;', 's-center-box')# >>> ['s-top-nav', 'display:none;'] re_g = re.compile('\s') result = re_g.split(html) print(result) # >>> 执行结果如下:# >>> ['<div', 'class="s-top-nav"', 'style="display:none;"></div><div', 'class="s-center-box"></div>'] re_g = re.compile('<div class="(.*?)"') result = re_g.match(html) print(result) # >>> 执行结果如下:# >>> <re.Match object; span=(0, 22), match='<div class="s-top-nav"'>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
通过练习会发现,正则的匹配主要还是通过
search() 与 findall() 函数来帮助我们获取匹配信息,其他函数更有锦上添花的功能。
PS:正则表达式最最重要的还是匹配规则的定义,也是非常灵活的。
🐳 【总结】Python常见案例
🐬 匹配1-100之间的数
import res = '66' # 1-100内的任意数字ret = re.match(r'(100|[1-9]\d{0,1})$', s)print(ret.group())# >>> 运行结果如下:# >>> 66
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
🐬 匹配座机号码
010-12345678,其构造规则为[3位数字][-][8位数字];或者0431-1234567,其构造规则为[4位数字][-][7位数字]
import res = "010-12345678"ret = re.search(r'^\d{3,4}-\d{7,8}$', s)print(ret.group())# >>> 运行结果:# >>> 010-12345678
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
🐬 匹配5-10位纯数字组成的qq号码,且不能以0开头
import res = "11010"ret = re.match(r'[1-9]\d{4,9}$', s)if ret != None: print(ret.group())else: print('匹配失败!') # >>> 运行结果:# >>> 11010
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
🐬 取出字符串中的所有字母
import res = "43arwer32656fafa6546jjuy#H"res = re.compile(r'[a-zA-Z]+')ret = res.findall(s)print(ret)# >>> 运行结果:# ['arwer', 'fafa', 'jjuy', 'H']
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
🐬 找出以字母y结尾的单词,忽略大小写
import res = 'study hard and make progress every day'res = re.compile(r'\w+y\b', re.I) # \b为边界ret = res.findall(s)print(ret)# 运行结果:# ['study', 'every', 'day']
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
🐬 将多个重复的字母替换成&
import res = "PythondddJavauuuHTMLFFPHP"res = re.compile(r'([a-zA-Z])\1+')ret = res.sub('&', s)print(ret)# 运行结果:# Python&Java&HTML&PHP
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9