第二十一天python3 python的正则表达式re模块学习
python的正则表达式
python使用re模块提供了正则表达式处理的能力;
常量
re.M
re.MULTILINE 多行模式 re.S
re.DOTALL 单行模式 re.I
re.IGNORECASE 忽略大小写 re.X
re.VERBOSE 忽略表达式中的空白字符 使用|位或运算开启多种选项
#示例:n = re.match('b',s,re.M)
编译
re.compile(pattern,flags=0)
设定flags,编译模式,返回正则表达式对象regex;
pattern就是正则表达式字符串,flags就是选项。正则表达式需要被编译,为了提高效率,这些编译后的结果被保存,下次使用同样的pattern的时候,就不需熬再次编译;
单次匹配
re.match(apttern,string,flags=0)
regex.match(string[,pos[,endpos]])
match匹配从字符串的开头匹配,regex对象match方法可以重新设定开始位置和结束位置,返回match对象; re.search(pattern,string,flag=0)
regex.search(string[,pos[,endpos]])
从头搜索知道第一个匹配,regex对象search方法可以重新设定开始位置和结束位置,返回match对象; re.fullmatch(pattern,string,flags=0)
regex.fullmatch(string[,pos[,endpos]])
整个字符串和正则表达式匹配;
示例:
import re
s = """bootle\nbag\nbig\napple"""
for i,c in enumerate(s,1):
print((i-1,c),end='\n' if i%8 == 0 else ' ') #执行结果:
(0, 'b') (1, 'o') (2, 'o') (3, 't') (4, 'l') (5, 'e') (6, '\n') (7, 'b')
(8, 'a') (9, 'g') (10, '\n') (11, 'b') (12, 'i') (13, 'g') (14, '\n') (15, 'a')
(16, 'p') (17, 'p') (18, 'l') (19, 'e')
#之所以这样做是为了更好的理解match的边界问题;
n = re.match('b',s,re.M)
m = re.match('boot',s)
l = re.match('t',s)
print(n)
print(m)
print(l)
执行结果:
<_sre.SRE_Match object; span=(0, 1), match='b'>
<_sre.SRE_Match object; span=(0, 4), match='boot'>
None
#n和m都返回了一个match对象,并且给出了边界范围,是前包后不包;并且只匹配一次;
#l返回的结果是None,是因为match的特性就是从字符串的开头开始匹配;相当于^\w;
"(0, 'b') (1, 'o') (2, 'o') (3, 't') (4, 'l') (5, 'e') (6, '\n') (7, 'b')
(8, 'a') (9, 'g') (10, '\n') (11, 'b') (12, 'i') (13, 'g') (14, '\n') (15, 'a')
(16, 'p') (17, 'p') (18, 'l') (19, 'e')"
#将需要匹配的字母"b"格式化
regex = re.compile('b')
#调用格式化后的match方法,并打印结果
print(regex.match(s))
print(regex.match(s,7))
print(regex.match(s,7,10))
print(regex.match(s,8))
#执行结果
#没有指定边界,默认从头开始找,默认匹配了第一个b;
<_sre.SRE_Match object; span=(0, 1), match='b'>
#指定了边界,把索引7作为开始,匹配到了第七个b;
<_sre.SRE_Match object; span=(7, 8), match='b'>
#指定了边界范围,指定7到10的索引范围,匹配到了7-10范围内的第一个b;
<_sre.SRE_Match object; span=(7, 8), match='b'>
#在指定的边界内,没有b字母,返回None;
None #总结:对需要匹配的字符串进行编译(compile);相当于生成了关于match的一个编译对象;再去调用这个对象的match方法,就可以定义范围了;
"(0, 'b') (1, 'o') (2, 'o') (3, 't') (4, 'l') (5, 'e') (6, '\n') (7, 'b')
(8, 'a') (9, 'g') (10, '\n') (11, 'b') (12, 'i') (13, 'g') (14, '\n') (15, 'a')
(16, 'p') (17, 'p') (18, 'l') (19, 'e')"
#对需要匹配的big进行格式化
regex = re.compile('big')
#调用格式化的fullmatch方法
print(regex.fullmatch(s,11))
print(regex.fullmatch(s,11,14))
print(regex.fullmatch(s,11,15))
#执行结果
None
<_sre.SRE_Match object; span=(11, 14), match='big'>
None
#从上面的执行结果可以看出fullmatch必须要给定明确的需要匹配字符串的边界范围,才有返回值;
全文搜索
re.findall(pattern,string,flags=0)
regex.findall(string[,pos[,endpos]])
对整个字符串,从左至右匹配,返回所有匹配项的列表; re.finditer(pattern,string,flags=0)
regex.finditer(string[,pos[,endpos]])
对真个字符串,从左至右匹配,返回所有匹配项,返回迭代器;
注意每次迭代返回的是match对象;
示例:
import re
s = """bootle\nbag\nbig\napple"""
for i,c in enumerate(s,1):
print((i-1,c),end='\n' if i%8 == 0 else ' ') #执行结果
#(0, 'b') (1, 'o') (2, 'o') (3, 't') (4, 'l') (5, 'e') (6, '\n') (7, 'b')
(8, 'a') (9, 'g') (10, '\n') (11, 'b') (12, 'i') (13, 'g') (14, '\n') (15, 'a')
(16, 'p') (17, 'p') (18, 'l') (19, 'e')
n = re.findall('b',s)
m = re.findall('b\w',s)
print(n)
print(m)
# 执行结果
['b', 'b', 'b']
['bo', 'ba', 'bi']
#锚定
regex = re.compile('^b\w',re.M)
regex1 = re.compile('^b\w',re.S)
print(regex.findall(s),"多行模式")
print(regex1.findall(s),"单行模式")
#执行结果
['bo', 'ba', 'bi'] 多行模式
['bo'] 单行模式
#不锚定
regex = re.compile('b\w',re.M)
regex1 = re.compile('b\w',re.S)
print(regex.findall(s),"多行模式")
print(regex1.findall(s),"单行模式")
#执行结果
['bo', 'ba', 'bi'] 多行模式
['bo', 'ba', 'bi'] 单行模式
#这地方要注意,当在finditer中用\b时,要加上r,防止\b被转译,如果不加r,则在finditer中\b表示的是ascii码中的含义,所以会有匹配不到的问题;
m = re.finditer(r'\bb',s)
print(m,type(m)) for r in m:
print(r) 执行结果:
#finditer返回了一个可迭代对象;
<callable_iterator object at 0x0000022FE0280BA8> <class 'callable_iterator'>
#用for循环迭代这个可迭代对象,finditer不但可以匹配到字符串,而且何以打印出字符的边界;
<_sre.SRE_Match object; span=(0, 1), match='b'>
<_sre.SRE_Match object; span=(7, 8), match='b'>
<_sre.SRE_Match object; span=(11, 12), match='b'>
匹配替换
re.sub(pattern,replacement,string,count=0,flags=0)
regex.sub(replacement,string,count=0)
使用pattern对字符串string进行匹配,对匹配项使用repl替换。replacement可以是string、bytes、function; re.subn(pattern,replacement,string,count=0,flags=0)
regex.subn(replacement,string,count=0)
同sub返回一个元组(new_string、number_of_subs_made),并且告诉总共匹配了几次;
示例:
import re
s = """bootle\nbag\nbig\napple""" m = re.sub('b\w','AAA',s)
print(m)
执行结果:
AAAotle\nAAAg\nAAAg\napple
import re
s = """bootle\nbag\nbig\napple""" n = re.sub('b\w',"AAA",s,count=1)
print(n)
#执行结果
AAAotle\nbag\nbig\napple
import re
s = """bootle\nbag\nbig\napple"""
regex = re.compile('b\w')
print(regex.sub('RRR',s,count=2))
执行结果:
RRRotle\nRRRg\nbig\napple
import re
s = """bootle\nbag\nbig\napple""" m = re.subn('b\w','AAA',s)
print(m)
regex = re.compile('b\w')
print(regex.subn('RRR',s,count=2))
print(regex.subn('RRR',s,count=10)) #执行结果
('AAAotle\nAAAg\nAAAg\napple', 3)
('RRRotle\nRRRg\nbig\napple', 2)
('RRRotle\nRRRg\nRRRg\napple', 3)
分割字符串
re.split(pattern,string,maxsplit=0,flags=0)
re.split分割字符串
import re
s = """01 bottle
02 bag
03 big1
100 able""" result1 = re.split('[\s\d]+',s)
print(1,result1) regex2 = re.compile('^[\s\d]+')
result2 = regex2.split(s)
print(2,result2) regex3 = re.compile('^[\s\d]+',re.M)
result3 = regex3.split(s)
print(3,result3) regex4 = re.compile('\s+\d+\s+')
result4 = regex4.split(s)
print(4,result4)
#执行结果:
1 ['', 'bottle', 'bag', 'big', 'able']
2 ['', 'bottle\n02 bag\n03 big1\n100 able']
3 ['', 'bottle\n', 'bag\n', 'big1\n', 'able']
4 ['01 bottle', 'bag', 'big1', 'able']
分组
使用小括号的pattern捕获的数据被放到了组group中;
match、search函数可以返回match对象;findall返回字符串列表;finditer返回一个个match对象; 如果pattern中使用了分组,如果有匹配的结果,会在match对象中:
1、使用group(N)方式返回对应分组;1-N是对应的分组,0返回整个匹配的字符串;
2、如果使用了命名分组,可以使用group(‘name’)的方式取分组;
3、也可以使用groups()返回所有分组;
4、使用groupdict()返回所有命名的分组;
示例:
import re
s = """bootle\nbag\nbig\napple"""
print("分组")
regex = re.compile('(b\w+)')
result = regex.match(s)
print(type(result))
print(1,'match',result.groups()) result1 = regex.search(s,1)
print(2,'search',result1.groups()) print('命名分组')
regex2 = re.compile('(b\w+)\n(?P<name2>b\w+)\n(?P<name3>b\w+)')
result2 = regex2.match(s)
print(3,'match',result2)
print(4,result2.group(3),result2.group(2),result2.group(1))
print(5,result2.group(0).encode())
print(6,result2.group('name2'),result2.group('name3'))
print(7,result2.groups())
print(8,result2.groupdict()) print('#####') result3 = regex.findall(s)
for x in result3:
print(type(x),x) regex3 = re.compile('(?P<head>b\w+)')
result3 = regex3.finditer(s)
for r in result3:
print(type(r),r,r.group(),r.group('head'))
#执行结果
分组
<class '_sre.SRE_Match'>
1 match ('bootle',)
2 search ('bag',)
命名分组
3 match <_sre.SRE_Match object; span=(0, 14), match='bootle\nbag\nbig'>
4 big bag bootle
5 b'bootle\nbag\nbig'
6 bag big
7 ('bootle', 'bag', 'big')
8 {'name3': 'big', 'name2': 'bag'}
#####
<class 'str'> bootle
<class 'str'> bag
<class 'str'> big
<class '_sre.SRE_Match'> <_sre.SRE_Match object; span=(0, 6), match='bootle'> bootle bootle
<class '_sre.SRE_Match'> <_sre.SRE_Match object; span=(7, 10), match='bag'> bag bag
<class '_sre.SRE_Match'> <_sre.SRE_Match object; span=(11, 14), match='big'> big big
第二十一天python3 python的正则表达式re模块学习的更多相关文章
- Python 日期时间处理模块学习笔记
来自:标点符的<Python 日期时间处理模块学习笔记> Python的时间处理模块在日常的使用中用的不是非常的多,但是使用的时候基本上都是要查资料,还是有些麻烦的,梳理下,便于以后方便的 ...
- python中正则表达式re模块详解
正则表达式是处理字符串的强大工具,它有自己特定的语法结构,有了它,实现字符串的检索,替换,匹配验证都不在话下. 当然,对于爬虫来说,有了它,从HTML里提取想要的信息就非常方便了. 先看一下常用的匹配 ...
- Python的正则表达式re模块
Python的正则表达式(re模块) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. Python使用re模块提供了正则表达式处理的能力.如果对正则表达式忘记的一干二净的话,可以花费 ...
- Day5 - Python基础5 常用模块学习
Python 之路 Day5 - 常用模块学习 本节大纲: 模块介绍 time &datetime模块 random os sys shutil json & picle shel ...
- Python基础5 常用模块学习
本节大纲: 模块介绍 time &datetime模块 random os sys shutil json & picle shelve xml处理 yaml处理 configpars ...
- Python自动化之常用模块学习
自动化常用模块 urllib和request模块学习笔记 '获取页面,UI自动化校验页面展示作用': #-*- coding : utf-8 -*-import urllib.requestimpor ...
- Python:正则表达式 re 模块
正则是处理字符串最常用的方法,我们编码中到处可见正则的身影. 正则大同小异,python 中的正则跟其他语言相比略有差异: 1.替换字符串时,替换的字符串可以是一个函数 2.split 函数可以指定分 ...
- Python:正则表达式—— re 模块
一.什么是正则表达式(Regular Expression) 正则表达式本身是一种小型的.高度专业化的编程语言,它内嵌在Python中,并通过 re(regular expression)模块实现.使 ...
- python/pandas 正则表达式 re模块
目录 正则解说 中文字符集 re模块常用方法 1.正则解说 数量词的贪婪模式与非贪婪模式 正则表达式通常用于在文本中查找匹配的字符串.Python里数量词默认是贪婪的(在少数语言里也可能是默认非贪婪) ...
随机推荐
- UART串口及Linux实现
UART,全称Universal Asynchronous Receiver Transmitter,通用异步收发器,俗称串口.作为最常用的通信接口之一,从8位单片机到64位SoC,一般都会提供UAR ...
- QY-16 浮标水质监测站 组成 及基础参数是什么?一文认识什么是浮标水质监测站
浮标水质监测站是设立在河流.湖泊.水库.近岸海域等流 域内的现场水质自动监测实验室,是以水质监测仪为核心,运用 传感器技术,结合浮标体.电源供电系统.数据传输设备组成的 放置于水域内的小型水质监测系统 ...
- 探索ABP的EventHub解决方案
在上一章中,我们构建了一个简单的全栈 Web 应用程序,我们已经看到了使用 ABP 框架开发应用的典型流程,在接下来,我们将使用 ABP 框架创建更高级的应用程序. 给出具有现实世界复杂性的例子并不容 ...
- 【DIY】【CSAPP-LAB】深入理解计算机系统--datalab笔记
title: 前言 <深入理解计算机系统>一书是入门计算机系统的极好选择,从其第三版的豆瓣评分9.8分可见一斑.该书的起源是卡耐基梅龙大学 计算机系统入门课(Introduction to ...
- 从rocketmq入手,解析各种零拷贝的jvm层原理
在上一篇文章中,主要介绍了rocketmq消息的存储流程.其主要使用了mmap的零拷贝技术实现了硬盘和内存的映射,从而提高了读写性能.在流程中有一个非常有意思的预热方法并没有详细分析,因为其中涉及到了 ...
- 【Java面试】JVM如何判断一个对象可以被回收
Hi, 我是Mic. 今天分享一道一线互联网公司必问的面试题. "JVM如何判断一个对象可以被回收" 关于这个问题,来看看普通人和高手的回答. 普通人: 嗯.......... 高 ...
- GDB的简单使用一
GDB的简单使用一 一.概念 二.GDB的基本使用方法一 调试前预备知识 获取进程的内核转储 启动gdb调试 1.启动 2.设置断点 3.运行程序 4.显示栈帧 5.显示变量 6.显示寄存器 7.单步 ...
- Servlet的本质
简介:Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层. 功能:使 ...
- 3D编程模式:依赖隔离模式
大家好~本文提出了"依赖隔离"模式 系列文章详见: 3D编程模式:开篇 本文相关代码在这里: 相关代码 目录 编辑器需要替换引擎 设计意图 定义 应用 扩展 最佳实践 更多资料推荐 ...
- 001 手把手用Git,Git从入门到上传本地项目到Github,看这篇就够了
安装git 下载Git 下载好后,一路next即可 安装好后,打开Git bash,进行配置 首先配置自己的身份 git config --global user.name "Name&qu ...