Python基础之模块:4、正则表达式和re模块
一、正则表达式
1、正则表达式前戏
引言:
正则表达式式一门独立的技术,所有的编程语言都可以使用
它是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配,可用用来筛选和查找字符串中符合条件的数据。
2、字符组
须知:
在中括号内填入相应字符,用来匹配与字符相应的数字或字母,字符组内所有的数据默认都是或的关系
用法表示:
[a值-b值] # 匹配a值到b值任意一个数
具体用法:
[0-9] # 匹配0-9之间任意一个数
[a-z] # 匹配a-z之间任意一个数
[A-z] # 匹配A-Z之间任意一个数
组合用法:
[0-9a-zA-Z] # 匹配数字或者小写字母或者大写字母
3、特殊符号
须知:
特殊符号默认匹配方式是挨个匹配,顺序由左至右
序号 | 符号 | 含义/用法 |
---|---|---|
1 | . | 匹配换行符以外的任意字符 |
2 | \w | 匹配字母、数字、下划线 |
3 | \W | 匹配非数字、非字母、非下划线 |
4 | \d | 匹配数字 |
5 | ^ | 匹配字符串的开头 |
6 | $ | 匹配字符串的结尾 |
7 | ^$ | 两则中间填入字符可用来精确匹配 |
8 | a|b | 匹配a或b(管道符是‘或’的意思) |
9 | () | 给正则表达式分组,不影响表达式匹配功能 |
10 | [] | 字符组内填写的内容默认都是或的关系 |
11 | [^] | 取反 匹配除了字符组内字符以外所有字符 |
4、量词
须知:
1.正则表达式默认情况下都是贪婪匹配>>>:尽可能多的匹配
2.两次必须结合表达式一起使用,不能单独出现,并且只影响左边第一个表达式:
kangkang{2}\d{5}
含义:'kangkang' 2次,\d 5次
序号 | 符号 | 含义/用法 |
---|---|---|
1 | * | 默认是多次默 认是多次(无穷次) |
2 | + | 匹配一次或多次 默认是多次(无穷次) |
3 | ? | 匹配0次或1次 默认是1次 |
4 | {n} | 重复n次 |
5 | {n,} | 重复n次或更多次 默认是更多次 |
6 | {n,m} | 重复n-m次 默认是m次 |
5、贪婪匹配与非贪婪匹配
须知:
所有量词默认都是贪婪匹配,想要变成非贪婪匹配就需要在量词后面加上‘问号’
- .# 属于典型的贪婪匹配,使用它,结束条件一般需要在左右添加条件
待匹配的文本:
<script>alert(123)</script>
贪婪匹配:
<.*> # <script>alert(123)</script>
非贪婪匹配:
<.*?> # <script>
6、转义符
须知:
1.斜杠与字母组合的时候有特殊含义
2.如果在python中可以使用r''取消转义
序号 | 符号 | 含义/用法 |
---|---|---|
1 | \n | 匹配换行符 |
2 | \\n | 匹配文本\n |
3 | \\\n | 匹配文本\\n |
7、正则表达式实战
须知:
1.一般情况我们只需要能够写出简单的正则即可,达到能够读懂复杂的正则
2.很多时候,很多问题,已经有人做好了,并且上传到网络共享库,我们只需要花点时间寻找即可
常用的校验表达式:
1.Email地址:
^\w+([-+.]\w+)@\w+([-.]\w+).\w+([-.]\w+)*$
2.手机号码:
^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$
3.电话号码:
\d{3}-\d{8}|\d{4}-\d{7}
4.身份证号(15位、18位数字):
^\d{15}|\d{18}$
5.日期格式:
^\d{4}-\d{1,2}-\d{1,2}
6.腾讯QQ号:
[1-9][0-9]{4,}
7.中国邮政编码:
[1-9]\d{5}(?!\d)
二、re模块
引言:
re模块是python专门为正则提供的一种模块,其内置方法都是与正则方法相关
1、模块导入
代码表现:
imoprt re
2、常见操作方法
1.findall(pattern,string)
作用:
- 在字符串中找到正则表达式所匹配的所有子串, 并返回一个列表, 如果没有找到匹配的, 则返回空列表
- 返回所有满足匹配的结果, 按照顺序依次放入列表中, 如果没有匹配结果, 返回一个空列表
代码用法:
导入模块:
import re
代码用法:
print(re.findall("\w","ab* 12$ _"))
print(re.findall("\W","ab* 12$ _"))
-----------------------------------------------------------
# ['a', 'b', '1', '2', '_']
# ['*', ' ', '$', ' ']
2.finditer(pattern,string)
作用:
- 在字符串中找到正则表达式所匹配的所有子串, 并把它们作为一个迭代器返回
- 取值时需要使用‘双下next’,用法与迭代器一致
代码用法:
导入模块:
import re
代码用法:
res = re.finditer("\w", "ab* 12$ _")
print(res)
print(next(res))
print(next(res))
print(next(res))
print(next(res))
print(next(res))
-------------------------------------------------
<callable_iterator object at 0x0000025C885271F0>
<re.Match object; span=(0, 1), match='a'>
<re.Match object; span=(1, 2), match='b'>
<re.Match object; span=(4, 5), match='1'>
<re.Match object; span=(5, 6), match='2'>
<re.Match object; span=(8, 9), match='_'>
3.search(pattern,string)
作用:
- 扫描整个字符串并返回第一个成功的匹配
- 该对象可以通过调用 group() 方法得到匹配的字符串,如果字符串没有匹配,则返回None
- 如果没有匹配到值就调用 group() 方法, 抛出异常
代码用法:
导入模块:
import
代码用法:
print(re.search("abc","112abc333abc"))
print(re.search("abc","112abc333abc").group())
print(re.search("abcd","12abc333abc"))
print(re.search("abcd","12abc333abc").group())
-----------------------------------------------------------
# <re.Match object; span=(3, 6), match='abc'>
# abc
# None
# 报错 "AttributeError" (因为没拿到这个对象,所以没有group()属性
4.match(pattern,string)
作用:
与 re.search 功能相同, 但必须匹配起始位置, 不然返回 None
可以使用上尖号 ^ : re.search("^abc",“abc”) 实现 re.match() 功能
代码用法:
导入模块:
import re
代码用法:
print(re.match("abc","abc22abc")
print(re.match("abc","abc22abc").group())
print(re.match("abc","1abc22abc"))
print(re.search("^abc","1abcabc"))
---------------------------------------------------------
# <re.Match object; span=(0, 3), match='abc'>
# abc
# None
# None (re.search)
5.re.compile()
作用:
- 在该函数中传入“规则字符”, 返回一个对象, 它单独使用没有任何意义, 需要和 findall( ), search( ), match( ) 组合使用
代码用法:
代码导入:
import re
代码用法:
obj = re.compile("\d{2}")
print(obj)
print(obj.findall("ab12c33b44"))
print(obj.search("ab12c33b44").group())
print(obj.match("12c33b44").group())
-------------------------------------------------
# re.compile('\\d{2}')
# ['12', '33', '44']
# 12
# 12 (注意,必须在开头就匹配到,不然group会报错)
6.split()
作用:
- 将一个字符串按照正则表达式匹配结果进行分割, 返回列表类型
- 以规定字符作为分隔符对字符串进行切分, 切分结果放入列表, 没匹配到返回原字符串列表
- 将规定字符放入
[ ]
则是逐个匹配
代码用法:
导入模块:
import re
代码用法:
print(re.split("o","abcoabcoabc"))
print(re.split("ab","abcoabcoabc"))
print(re.split("d","abcoabcoabc"))
print(re.split("[o]","abcoabcoabc"))
print(re.split("[ob]","abcoabcoabc"))
print(re.split("[oba]","abcoabcoabc"))
------------------------------------------------------
# ['abc', 'abc', 'abc']
# ['', 'co', 'co', 'c']
# ['abcoabcoabc'] (没匹配到返回原字符串)
# ['abc', 'abc', 'abc']
# ['a', 'c', 'a', 'c', 'a', 'c']
# ['', '', 'c', '', '', 'c', '', '', 'c']
# 先使用"o"匹配进行分隔, 得到结果"['abc', 'abc', 'abc']", 在使用"b"进行匹配分隔,得到结果后再使用"a"匹配进行分隔
7.sub() 和 subn()
作用:
- 匹配“规则字符”, 并将其该成指定字符, 返回改变后的字符串, 后面可跟个数参数, 不指定默认替换所有
- re.subn( ) 返回一个元组, 第二个元素返回的是替换的个数
代码用法:
导入模块:
import re
代码用法:
print(re.sub("a","A","i am a man"))
print(re.sub("a","b","i am a man"))
print(re.sub("am","b","i am a man"))
print(re.sub("a","AA","i am a man"))
print(re.sub("a","A","i am a man",1))
print(re.sub("a","A","i am a man",2))
print(re.sub("a","A","i am a man",3))
print(re.sub("a","A","i am a man",9))
print(re.subn("a","A","i am a man"))
print(re.subn("a","A","i am a man",2))
------------------------------------------------------------
# i Am A mAn
# i bm b mbn
# i b a man
# i AAm AA mAAn
# i Am a man
# i Am A man
# i Am A mAn
# i Am A mAn (超出字符串中最大的个数不会报错,而是替换所有)
# ('i Am A mAn', 3) (显示替换的个数)
# ('i Am A man', 2)
3、re模块补充说明
1.分组优先
res = re.findall('www.(baidu|oldboy).com', 'www.oldboy.com')
print(res) # ['oldboy']
findall分组优先展示:优先展示括号内正则表达式匹配到的内容
res = re.findall('www.(?:baidu|oldboy).com', 'www.oldboy.com')
print(res) # ['www.oldboy.com']
res = re.search('www.(baidu|oldboy).com', 'www.oldboy.com')
print(res.group()) # www.oldboy.com
res = re.match('www.(baidu|oldboy).com', 'www.oldboy.com')
print(res.group()) # www.oldboy.com
2.分组别名
res = re.search('www.(?P<content>baidu|oldboy)(?P<hei>.com)', 'www.oldboy.com')
print(res.group()) # www.oldboy.com
print(res.group('content')) # oldboy
print(res.group(0)) # www.oldboy.com
print(res.group(1)) # oldboy
print(res.group(2)) # .com
print(res.group('hei')) # .com
Python基础之模块:4、正则表达式和re模块的更多相关文章
- Py修行路 python基础 (二十一)logging日志模块 json序列化 正则表达式(re)
一.日志模块 两种配置方式:1.config函数 2.logger #1.config函数 不能输出到屏幕 #2.logger对象 (获取别人的信息,需要两个数据流:文件流和屏幕流需要将数据从两个数据 ...
- Python基础(9)--正则表达式
正则表达式是一个很有用的工具,可处理复杂的字符匹配和替换工作.在Python中内置了一个re模块以支持正则表达式. 正则表达式有两种基本的操作,分别是匹配和替换. 匹配就是在一个文本字符串中搜索匹配一 ...
- python基础——14(shelve/shutil/random/logging模块/标准流)
一.标准流 1.1.标准输入流 res = sys.stdin.read(3) 可以设置读取的字节数 print(res) res = sys.stdin.readline() print(res) ...
- python基础(十三)--os和sys模块
os模块 os.getpwd():获取当前工作目录(windows下没有) os.listdir(path):列出目录下的文件 os.remove(path):删出文件 (不能是目录,即文件夹) os ...
- Python 基础篇:编码、变量、模块
1. 编码 python解释器在加载 .py 文件中的代码时,会对内容进行编码(默认ASCII). 2. 变量 变量定义的规则: 变量名只能是 字母.数字或下划线的任意组合 变量名的第一个字符不能是数 ...
- Python学习(九) —— 正则表达式与re模块
一.正则表达式 定义:正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符.及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑. 正则表达 ...
- Python基础笔记系列十二:requests模块的简单应用
本系列教程供个人学习笔记使用,如果您要浏览可能需要其它编程语言基础(如C语言),why?因为我写得烂啊,只有我自己看得懂!! httpbin httpbin这个网站能测试 HTTP 请求和响应的各种信 ...
- python基础-协程函数、递归、模块、包等内容
1. 协程函数 1.1 yield基本用法 yield作用 1.把函数的执行结果封装好,即封装__iter__和__next__,即得到一个迭代器 2.与return功能类似,都可以返回值,但不同的是 ...
- 第六篇:python基础_6 内置函数与常用模块(一)
本篇内容 内置函数 匿名函数 re模块 time模块 random模块 os模块 sys模块 json与pickle模块 shelve模块 一. 内置函数 1.定义 内置函数又被称为工厂函数. 2.常 ...
- python 基础 8.0 regex 正则表达式--常用的正则表达式
一. python 中常用的正则表达式 二. 正则表达式的网站,可以进行在线正则匹配 https://regex101.com/ 1. 使用方法及正则介绍 1> ‘.’ 匹 ...
随机推荐
- 汇编/C/C++/MFC/JAVA/C# 进阶群103197177
欢迎广大喜欢编程朋友加入进来.如果是大神请分享你的经验,带领广大小伙伴一起打怪升级得经验:如果是编程新人,那么这里是你不二的选择,分享,奉献是我们追求的目标:我们之中大部分是有一年多工作经验的热血编程 ...
- UI自动化框架搭建之Python3
UI自动化框架搭建--unittest 使用的代码是Python3版本,与时俱进哈哈 解释一下我的框架目录接口(每个人框架的目录接口不一样,根据实际要求) common目录:公共模块,这个地方可以存放 ...
- numa 自动balance 的bug分析
关于migrate_swap() 和 active_balance()之间的hardlock 背景:这个是在3.10.0-957.el7.x86_64 遇到的一例crash 下面列一下我们是怎么排查并 ...
- java单线程100%利用率
容器内就获取个cpu利用率,怎么就占用单核100%了呢 背景:这个是在centos7 + lxcfs 和jdk11 的环境上复现的 目前这个bug已经合入到了开源社区, 链接为 https://git ...
- ARC125E - Snack (网络流)
题面 有 N N N 种糖果, M M M 个小孩子,第 i i i 种糖果有 A i A_i Ai 个,第 i i i 个孩子不能有超过 B i B_i Bi 个同种类型的糖果,第 i i i ...
- KingbaseESV8R6不同隔离级下xmin的区别
背景 sys_stat_activity视图中用两个字段表示: backend_xid表示事务开始需要申请的事务id backend_xmin表示一个事务快照,表示当前数据库中最小的正在运行的事务号, ...
- 新一代网络请求库:python-httpx库
目录 httpx库 一. 概述 1. 简介 2. 命令行模式 3. 快速开始 3.1 get请求 3.2 post请求 3.2.1 表单 3.2.2 文件 3.2.3 JSON 3.2.4 二进制 3 ...
- bean的作用域解析
说明 意义 1.在Spring中,Bean的作用域可以通过scope属性来指定. 2.指定作用域的目的是 存储在此类单例bean的高速缓存中,并且对该命名bean的所有后续请求和引用都返回该高速 ...
- TDengine概述以及架构模型
TDengine TDengine是一个高效的存储.查询.分析时序大数据的平台,专为物联网.车联网.工业互联网.运维监测等优化而设计. 您可以像使用关系型数据库MySQL一样来使用它. TDengin ...
- Job for redis-server.service failed because the control process exited with error code(Centos 7 设置Redis开机自启报错)
报错信息如下: Job for redis-server.service failed because the control process exited with error code. See ...