Python3 正则表达式 re 模块的使用 - 学习笔记
re 模块的引入
Python 自1.5版本起增加了
re模块,它提供 Perl 风格的正则表达式模式。
re模块使 Python 语言拥有全部的正则表达式功能。
re 模块的使用
参数含义
- pattern: 字符串形式的正则表达式
- string: 要匹配的字符串
- flags: 可选,表示匹配模式
- pos:可选,字符串中开始搜索的位置索引
- endpos:可选,endpos 限定了字符串搜索的结束
- 不填pos endpos默认扫描全部
re.compile()
compile(pattern, flags=0)
- 将正则表达式的样式编译为一个 正则表达式对象 (正则对象)
- 可以使用正则对象调用
match()等函数
>>> test = '1 one 2 two 3 three'
>>> a=re.compile(r'\d+')
>>> b=a.match(test)
>>> print(f"输出:{b[0]}")
输出:1
re.match()与re.search()
re.match
re.match(pattern, string, flags=0)
Pattern.match(string, pos, endpos)
- 如果 string 的 开始位置 能够找到这个正则样式的任意个匹配,就返回一个相应的 匹配对象。如果不匹配,就返回 None
- 可以使用
group(num)或groups()匹配对象函数来获取匹配表达式group(num=0)表示匹配的整个表达式的字符串group()可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组。groups()返回一个包含所有小组字符串的元组,从 1 到 所含的小组号。
>>> test = '1 one 2 two 3 three'
>>> a=re.compile(r'(\d+) (\w+)')
>>> b=a.match(test)
>>> print(f"输出:{b.group()}")
>>> print(f"输出:{b.group(2)}")
>>> print(f"输出:{b.group(1,2)}")
>>> print(f"输出:{b.groups()}")
输出:1 one
输出:one
输出:('1', 'one')
输出:('1', 'one')
Match.start([group])和Match.end([group])- 返回
group匹配到的字串的开始和结束标号。 - 如果
group存在,但未产生匹配,就返回-1。
- 返回
Match.span([group])- 对于一个匹配 m ,返回一个二元组
(m.start(group), m.end(group)) - 注意如果
group没有在这个匹配中,就返回(-1, -1)
- 对于一个匹配 m ,返回一个二元组
re.search()
re.search(pattern, string, flags=0)
Pattern.search(string, pos, endpos)
- 扫描整个 string 寻找第一个匹配的位置, 并返回一个相应的 匹配对象。如果没有匹配,就返回 None
- 其他与
match()一致
>>> test = 'one 2 two 3 three'
>>> a = re.compile(r'(\d+) (\w+)')
>>> b = a.search(test)
>>> c = a.match(test)
>>> print(c)
>>> print(f"输出:{b.group()}")
>>> print(f"输出:{b.group(2)}")
>>> print(f"输出:{b.group(1,2)}")
>>> print(f"输出:{b.groups()}")
输出:None
输出:2 two
输出:two
输出:('2', 'two')
输出:('2', 'two')
区别
match()只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回 None- 而
search()匹配整个字符串,直到找到一个匹配
re.findall()与re.finditer()
re.findall()
re.findall(pattern, string, flags=0)
Pattern.findall(string, pos, endpos)
- 对 string 返回一个不重复的 pattern 的匹配列表, string 从左到右进行扫描,匹配按找到的顺序返回
- 如果样式里存在一到多个组,就返回一个组合列表;就是一个元组的列表(如果样式里有超过一个组合的话)
>>> test = 'one 2 two 3 three'
>>> a = re.compile(r'(\d+) (\w+)')
>>> b = a.search(test)
>>> b=a.findall(test)
>>> print(f"输出:{b}")
输出:[('2', 'two'), ('3', 'three')]
re.finditer()
re.finditer(pattern, string, flags=0)
Pattern.finditer(string, pos, endpos)
- pattern 在 string 里所有的非重复匹配,返回为一个迭代器 iterator 保存了 匹配对象
>>> test = 'one 2 two 3 three'
>>> a = re.compile(r'(\d+) (\w+)')
>>> b = a.finditer(test)
>>> print(f"输出:{b}")
>>> for i in b:
print(f"输出:{i}")
输出:<callable_iterator object at 0x036E7BD0>
输出:<re.Match object; span=(4, 9), match='2 two'>
输出:<re.Match object; span=(10, 17), match='3 three'>
区别
- 二者最大的区别在于一个返回列表,一个返回迭代器
re.sub()与re.subn()
re.sub()
re.sub(pattern, repl, string, count=0, flags=0)
- repl : 替换的字符串,也可为一个函数。
- count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。
- 最后返回替换结果
>>> test = '1 one 2 two 3 three'
>>> a=re.sub(r'(\d+)','xxx',test)
>>> print(f"输出:{a}")
>>> print(f"输出:{test}")
输出:xxx one xxx two xxx three
输出:1 one 2 two 3 three
re.subn()
re.subn(pattern, repl, string, count=0, flags=0)
参数含义同上
- 功能与
re.subn相同,但是返回一个元组 (字符串, 替换次数)
>>> test = '1 one 2 two 3 three'
>>> a=re.subn(r'(\d+)','xxx',test)
>>> print(f"输出:{a}")
>>> print(f"输出:{test}")
输出:('xxx one xxx two xxx three', 3)
输出:1 one 2 two 3 three
re.split()
re.split(pattern, string, maxsplit=0, flags=0)
maxsplit:表示分割次数,默认为0,表示无限制
- 用 pattern 分开 string
- 如果在 pattern 中捕获到括号,那么所有的组里的文字也会包含在列表里
>>> test = '1 one 2 two 3 three'
>>> a = re.split(r'\d+', test)
>>> b = re.split(r'(\d+)', test)
>>> print(f"输出:{a}")
>>> print(f"输出:{b}")
输出:['', ' one ', ' two ', ' three']
输出:['', '1', ' one ', '2', ' two ', '3', ' three']
正则表达式修饰符(匹配模式)
re.I 使匹配对大小写不敏感
re.L 做本地化识别匹配
re.M 多行匹配,影响 ^ 和 $
遇到\n视为新的一行,重新匹配 ^ 和 $
re.S 使 . 匹配包括换行在内的所有字符
re.U 根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B.
re.X 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。
Python3 正则表达式 re 模块的使用 - 学习笔记的更多相关文章
- python3 正则表达式re模块
正则表达式的功能:字符串的模糊匹配查询import re元字符 . ---->匹配除换行符意外的任意字符 ^ ---->匹配行首位置 $ ---->匹配行尾位置 关于重复的元字符 * ...
- python3 正则表达式 re模块之辣眼睛 计算器
额...学到几个常用模块了,也要其中考试了,每天晚上敲一点,敲得脑壳疼,不过又想到好一点的办法了,有时间再改吧. 此非吾所欲也,实属无奈也....复习之路漫漫,吾将到书上求索,在此不多逗留,我挥一挥衣 ...
- co模块源码学习笔记
// Sorrow.X --- 添加注释,注释纯属个人理解 /** * slice变量 引用 数组的 slice方法 */ var slice = Array.prototype.slice; /** ...
- Nginx模块之Nginx-Ts-Module学习笔记(一)抢险体验
1.通过HTTP接收MPEG-TS2.生产和管理Live HLS 3.按照官方的编译和配置,当然了我是第一次编译没有通过,在作者重新调整下,编译成功,感谢:@arut https://github.c ...
- python 排序模块 ———— heapq(学习笔记)
from heapq import * def heasort(initi):# 排序 h=[] for value in initi: heappush(h,value)#将每一个item进入hea ...
- Python学习笔记基础篇——总览
Python初识与简介[开篇] Python学习笔记——基础篇[第一周]——变量与赋值.用户交互.条件判断.循环控制.数据类型.文本操作 Python学习笔记——基础篇[第二周]——解释器.字符串.列 ...
- AVAWEB学习笔记 ---- 系列文章
[JAVAWEB学习笔记]网上商城实战5:后台的功能模块 [JAVAWEB学习笔记]网上商城实战4:订单模块 [JAVAWEB学习笔记]网上商城实战3:购物模块和订单模块 [JAVAWEB学习笔记]网 ...
- python3.4学习笔记(十二) python正则表达式的使用,使用pyspider匹配输出带.html结尾的URL
python3.4学习笔记(十二) python正则表达式的使用,使用pyspider匹配输出带.html结尾的URL实战例子:使用pyspider匹配输出带.html结尾的URL:@config(a ...
- Python3学习笔记(urllib模块的使用)转http://www.cnblogs.com/Lands-ljk/p/5447127.html
Python3学习笔记(urllib模块的使用) 1.基本方法 urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, ...
随机推荐
- FreeSql配合仓储实现软删除
该篇内容由个人博客点击跳转同步更新!转载请注明出处! 前段时间使用FreeSql作为ORM,写了一个简单的CMS,在这里总结一下其中的使用心得. 仓储配合全局过滤器 1. 统一的删除标志 如:数据库字 ...
- P3810 陌上花开 CDQ分治
陌上花开 CDQ分治 传送门:https://www.luogu.org/problemnew/show/P3810 题意: \[ 有n 个元素,第 i 个元素有 a_i. b_i. c_i 三个属性 ...
- java 如何重写equals
java中重写equals表面上看只涉及equals与hashCode两个方法,但如果仔细考虑发现重写一个逻辑完整的equals并不容易,需要考虑克隆,继承(多态)等问题,下面是最近的几点心得 1.先 ...
- CString::CompareNoCase与CString::Compare的区别
转载:https://blog.csdn.net/lingdxuyan/article/details/4362116 函数原型:int CompareNoCase( LPCTSTR lpsz ) c ...
- (1)51单片机NOP指令
提问:什么是NOP指令?干什么用的?单片机程序里执行一条nop指令需要多长时间? (1)一个NOP就是一个机器周期 (2)空指令,延时一个机器周期 (3)这个与单片机型号.指令类型和使用的晶振频率有关 ...
- centos7 断电导致 generating /run/initramfs/rdsosreport.txt 问题
开机就进入命令窗口,窗口提示信息如下: generating “/run/initramfs/rdsosreport.txt” entering emergencymode. exit the she ...
- Java并发编程系列-(8) JMM和底层实现原理
8. JMM和底层实现原理 8.1 线程间的通信与同步 线程之间的通信 线程的通信是指线程之间以何种机制来交换信息.在编程中,线程之间的通信机制有两种,共享内存和消息传递. 在共享内存的并发模型里,线 ...
- POJ-1741 树上分治--点分治(算法太奇妙了)
给你1e5个节点的树,(⊙﹏⊙) 你能求出又几对节点的距离小于k吗??(分治NB!) 这只是一个板子题,树上分治没有简单题呀!(一个大佬说的) #include<cstdio> #incl ...
- 微服务Dubbo和SpringCloud架构设计、优劣势比较
本文主要围绕微服务的技术选型.通讯协议.服务依赖模式.开始模式.运行模式等几方面来综合比较Dubbo和Spring Cloud 这2种开发框架.架构师可以根据公司的技术实力并结合项目的特点来选择某个合 ...
- ocx控件的坑
前言 这还是第一次写博客,以前太懒了,现在发现是很有必要记录下这些经验和问题的.最近项目中有个需求(报表单据需要客户签名,连接签字板,把签名单据同步到服务器上),需要和硬件交互,当时硬件商提供了ocx ...