re正则表达式必备基础知识
Regular Expression Operations
- 正则表达式
- 正则表达式测试工具
- 一.原子
- 1.普通字符作为原子
- 2.非打印字符作为原子
- 3.通用字符作为原子
- 4.原子表
- 二.原子符
- 1.任意匹配原子符
- 2.边界限制原子符
- 3.限定符(重复匹配)
- 4.模式选择符(分支条件)
- 5.分组
- 分组函数 .group(n) 与 .groups()
- 三.模式修正
- 四.反义
- 五. 转义
- 五.贪婪模式与懒惰模式
- 六. python中正则表达式常见函数
- 1. re.match()函数
- 2. re.search()函数
- 3. re.findall()与re.finditer()全局匹配函数
- 4. re.sub()函数
- 5. re.split()函数
- 6. re.compile()函数
- 参考文档
- 修订时间
正则表达式
正则表达式测试工具
开源中国
一.原子
原子是正则表达式中最基本的组成单位,每个正则表达式至少要包含一个原子
常见原子主要分为以下4类:
- 普通字符
- 非打印字符
- 通用字符
- 原子表
1.普通字符作为原子
使用一些普通字符,如:字母、数字、下划线
符号 | 含义 |
---|---|
0-9 | 数字 |
a-z | 小写字母 |
A-Z | 大写字母 |
_ | 下划线 |
2.非打印字符作为原子
在字符串中用于格式控制的符号
符号 | 含义 |
---|---|
\n | 换行符 |
\t | 制表符 |
3.通用字符作为原子
通用字符,即一个原子可以匹配一类字符
符号 | 说明 |
---|---|
\w | 匹配 字母、数字、下划线、汉字 |
\W |
匹配 非 字母、数字、下划线、汉字
|
\s | 匹配 任意空白符(空格,制表符Tab,换行符,中文全角空格等) |
\S |
匹配任意 非 空白符(空格,制表符Tab,换行符,中文全角空格等)
|
\d | 匹配 数字 |
\D |
匹配 非 数字
|
注意:小写字母为本义,大写字母为反义
4.原子表
一个原子表内可自行添加多个用于匹配的字符
符号 | 含义 |
---|---|
[ ] | 匹配 括号内任一字符 |
如:
举例 | 含义 |
---|---|
[red] | 匹配r、e、d |
[^red] |
匹配非 r、e、d
|
二.原子符
1.任意匹配原子符
符号 | 含义 |
---|---|
. | 匹配 除换行符以外的任意字符 |
2.边界限制原子符
锚(Anchors)是将正则表达式锚定到字符串中特定位置的特殊字符,最常见的锚点是插入符号^和美元符号$。
符号 | 含义 |
---|---|
^ | 匹配 字符串的开头 |
$ | 匹配 字符串的结尾 |
\b | 匹配单词边界 |
\B |
匹配非 单词边界
|
还有另外两个锚:\b匹配单词边界,\b匹配非边界。因此,/\bthe\b/匹配单词the,但不匹配单词other。
更严格地说,正则表达式中的“单词(word)”定义为数字、下划线或字母(digits, underscores, or letters)的任意序列;这是基于编程语言中“单词”的定义。例如,/ b99\b/将匹配字符串99,在句子 There are 99 bottles of beer on the wall 中(因为 99 前后有空格),但是在 There are 299 bottles of beer on the wall 中匹配不到 99(因为99前有个2,不是空格边界),但是它会匹配到 99 在 $99 这个句子中,因为$不属于前面定义的单词。
3.限定符(重复匹配)
符号 | 说明 |
---|---|
? | 重复 0或1个字符 |
* | 重复 0或多个字符 |
+ | 重复 1或多个字符 |
{n} | 重复 n次字符 |
{n,} | 至少重复 n次字符 (匹配 大于n次字符) |
{n,m} | 重复 n到m次字符 |
4.模式选择符(分支条件)
匹可以设置多个模式,匹配时可以从中选择任意一个模式进行匹配
符号 | 含义 |
---|---|
A|B | 选择模式A或者B进行 匹配 |
注意:分支匹配时会从左到右,所以顺序很重要
5.分组
用小括号()来指定子表达式
,将想要提取的子字符串括起来,来进行分组,调用 group 方法传入分组的索引即可获取提取的结果。
符号 | 含义 |
---|---|
() | 指定子表达式 |
注意:每一个()都会当做一个结果来显示,无结果会返回空。
分组函数 .group(n) 与 .groups()
可分别显示match、search等返回匹配对象
的函数的结果
.group(0) 与 .group() 显示完整的匹配结果
.group(k) k>0, 显示第k个结果.groups() 以元祖的形式显示所有结果
部分函数可直接返回结果,无需主动调用分组函数
三.模式修正
在不改变正则表达式的情况下,通过模式修正符改变正则表达式的含义,从而实现一些匹配结果的调整等功能
常用的模式修正符:
符号 | 全写 | 含义 |
---|---|---|
re.I | IGNORECASE | 匹配时,忽略大小写 |
re.M | MULTILINE | 多行匹配,影响 ^ 和 $ |
re.L | LOCAL | 使预定字符类 \w \W \b \B \s \S ,做本地化识别(locale-aware)匹配 |
re.U | UNICODE | 根据Unicode字集解析字符,影响预定字符类 \w \W \b \B \s \S \d \D |
re.S | DOTALL | 让.匹配包括换行符,即匹配任意字符 |
re.X | VERBOSE | 详细模式。这个模式下正则表达式可以是多行,忽略空白字符,并可以加入注释 。该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解 |
可运用于:后面函数中的flags标志位参数
举例:
import re# 字符串部分换行
content = '''Hello 1234567 World_This
is a Regex Demo
'''
result = re.match('^He.*?(\d+).*?Demo$', content)
print(result.group(1))
结果报错:
AttributeError Traceback (most recent call last)
<ipython-input-18-c7d232b39645> in <module>()5 '''6 result = re.match('^He.*?(\d+).*?Demo$', content)
----> 7 print(result.group(1))AttributeError: 'NoneType' object has no attribute 'group'
正则表达式没有匹配到这个字符串,返回结果为 None,而我们又调用了 group 方法导致 AttributeError。
加一个修饰符 re.S,即可修正这个错误:
result = re.match('^He.*?(\d+).*?Demo$', content, re.S)# 结果
1234567
在网页匹配中,较为常用的修饰符有 re.S 和 re.I。而 re.S 在网页匹配中更常用,因为 HTML 节点经常会有换行,加上它,就可以匹配节点与节点之间的换行了。
四.反义
反义即原义取反,前面原子的通用字符类型有部分涉及
符号 | 含义 |
---|---|
\D |
匹配任意非 数字
|
\W |
匹配任意非 字母数字下划线
|
\S |
匹配任意非 空白字符
|
\B |
匹配非 单词边界
|
\b | 匹配单词边界 |
[^ ] |
匹配除 原子表以外的任意字符
|
符号^有三种用途:匹配一行的开始(模式pattern字符串开头),指示方括号内的否定(模式pattern中的方括号开头),以及仅仅表示一个插入符号(除前两者)。
五. 转义
如果目标字符串中,本身包含带有特殊含义的字符,则需要用反斜杠" \ "符号,在特殊字符前面放置,而进行转义。
import recontent = '(百度) www.baidu.com'
result = re.match('\(百度 \) www\.baidu\.com', content)
print(result)# 结果
<_sre.SRE_Match object; span=(0, 17), match='(百度) www.baidu.com'>
五.贪婪模式与懒惰模式
对于ppqqq,通常情况下,我们需要使字符串能匹配尽可能多的字符,举例:则 p.*q 会匹配最长的,从第一个p开头、到最后一个q结尾的字符串。
但有时候,我们需要懒惰匹配,即尽可能匹配少的字符,举例:则 p.*?q 会匹配,从第一个p开头到第一个q结尾的字符串。
懒惰限定符与贪婪限定符:
符号 | 模式 | 含义 |
---|---|---|
.* | 贪婪模式 | 尽可能地多匹配 |
.*? | 懒惰模式 | 尽可能的少匹配 |
*? | 懒惰模式 | 重复任意次,但尽可能减少重复 |
+? | 懒惰模式 | 重复1次或更多,但尽可能减少重复 |
?? | 懒惰模式 | 重复0次或1次,但尽可能减少重复 |
{n,m}? | 懒惰模式 | 重复n次到m次,但尽可能减少重复 |
{n,}? | 懒惰模式 | 重复n次以上,但尽可能减少重复 |
思考:为什么ppqqq懒惰匹配p.*?q时,不是从第二个p开始,从而截取最短的字符串pq,而是ppq?
注意:正则表达式里有另一条规则,比懒惰/贪婪的优先级更高:最先开始的匹配拥有最高的优先权--The match that begins earliest wins
总结:
在做匹配的时候,字符串中间尽量使用非贪婪匹配,也就是用 .*? 来代替 .*,以免出现匹配结果缺失的情况。
但需要注意的是,如果匹配的结果在字符串结尾,.*? 就有可能匹配不到任何内容了,因为它会匹配尽可能少的字符。
六. python中正则表达式常见函数
正则表达式不是 Python 独有的,它也可以用在其他编程语言中。但是 Python 的 re 库提供了整个正则表达式的实现,利用这个库,可以在 Python 中使用正则表达式。
下面介绍一些常用函数:
1. re.match()函数
含义:
从string的头开始进行匹配,即从第一个字符开始完全匹配才成功,结果返回一个对象;如果不匹配则返回None。
格式:
re.match(pattern, string, flags)
参数:
pattern - 正则表达式
string - 要匹配的文本字符
flags - 可选参数,可选择模式修正等信息,可以使用按位或'|'表示同时生效。支持 re.L|re.M 同时匹配
示例:
import recontent = 'Hello 123 4567 World_This is a Regex Demo'
print(len(content))
result = re.match('^Hello\s\d\d\d\s\d{4}\s\w{10}', content)
print(result)
# 输出匹配的内容
print(result.group())
# 匹配跨度、长度范围
print(result.span())
结果(SRE_Match 对象):
41
<_sre.SRE_Match object; span=(0, 25), match='Hello 123 4567 World_This'>
Hello 123 4567 World_This
(0, 25)
2. re.search()函数
含义:
从整体进行匹配,即从任意位置开始完全匹配成功就返回对象,但只会匹配出返回的第一个对象
比match高级一点
格式:
re.search(pattern, string, flags)
参数:
pattern - 正则表达式
string - 要匹配的文本字符
flags - 可选参数,可选择模式修正等信息,可以使用按位或'|'表示同时生效。
3. re.findall()与re.finditer()全局匹配函数
含义:
- 将符合模式的内容全匹配出来,匹配返回所有匹配结果,以列表的形式呈现,每个元素都是元组。
- 将符合模式的内容全匹配出来,匹配返回所有匹配结果,以可迭代对象的形式呈现
比search更高级一点
格式:
re.findall(pattern, string, flags)re.finditer(pattern, string, flags)
参数:
pattern - 正则表达式
string - 要匹配的文本字符串
flags - 可选参数,可选择模式修正等信息,可以使用按位或'|'表示同时生效。
4. re.sub()函数
含义:
根据正则表达式,将匹配到的字符串进行替换
格式:
re.sub(pattern, rep, string, max)
参数:
pattern - 正则表达式
rep - 要替换成的字符串
string - 源字符串
max - 可选项,最多替换次数,默认将符合模式的结果全部替换
5. re.split()函数
含义:
以匹配到的字符串为分割线,对原字符串进行分割
格式:
re.split(pattern, string, maxsplit, flags)
参数:
pattern - 正则表达式
string - 要进行切割的字符串
maxsplit - 最大分割次数,不指定将全部分割
6. re.compile()函数
含义:
编译正则表达式,返回一个模式对象。可以把常用的正则表达式,编译成正则表达式对象,方便以后调用以提高效率
格式:
re.compile(pattern, flags)
参数:
pattern - 指定正则表达式
flags - 可选参数,可选择模式修正等信息,可以使用按位或'|'表示同时生效。
使用:
regex = re.compile(pattern, flags)
regex.search(string)
compile 还可以传入修饰符,例如 re.S 等修饰符,这样在 search、findall 等方法中就不需要额外传了。所以,compile 方法可以说是给正则表达式做了一层封装,以便我们更好的复用。
注意:
该函数的使用:
请不要再使用compile了
参考文档
正则表达式30分钟入门教程
python编程基础—正则表达式
修订时间
- 第一次修订 2019/12/14
- 第二次修订 2020/4/26
- 第三次修订 2022/2/5
re正则表达式必备基础知识相关推荐
- python基础一入门必备知识-Python数据分析入门必备基础知识
今天,老师要带大家解数据分析的定义.核心思路.应用领域以及开发流程,向大家全方位展示数据分析入门必备基础知识,全都是干货哦!虽然看完本文,不能让大家立马变身为一名数据分析师,但是能让大家对数据分析有一 ...
- 笔刷怎么做_零基础怎么学板绘?板绘小白必备基础知识
零基础怎么学板绘?板绘小白必备基础知识!零基础学板绘需要准备什么东西?零基础学板绘需要学习哪些软件?板绘是做电影时要用到的人物场景原画的最重要的绘画方式,也是美术爱好者日常学习和创作的首选方式之一.那 ...
- java高手之路上的必备基础知识
其实Java也就这么回事,重要的还是坚持,不能三天打鱼两天晒网.每一个分支下都是一门专业的技术,重要的是证明学精,熟练运用各项软件语言. 下面和大家分享java高手之路上的必备基础知识: 1.面向对象 ...
- 【网络通信】【电信运营商实战工程师】思科设备篇-网络工程师必备基础知识
电信运营商实战工程师系列文章. 思科设备篇-网络工程师必备基础知识. 文章目录 1. 电信运营商网络设备机房 2. 认识并管理运营商网络设备 3. GNS3 安装与配置 4. IPv4地址及子网划分 ...
- 电商软件性能测试,实战 | 电商业务的性能测试(一): 必备基础知识
原标题:实战 | 电商业务的性能测试(一): 必备基础知识 1. 测试步骤及模型分析 1.1 测试步骤总览 需求分析与测试设计(性能需求目标+业务模型拆解) 测试数据准备和构造(基于模型的数据准备) ...
- 电子工程师必备基础知识
电子工程师必备基础知识(一) 运算放大器通过简单的外围元件,在模拟电路和数字电路中得到非常广泛的应用.运算放大器有好些个型号,在详细的性能参数上有几个差别,但原理和应用方法一样. 运算放大器通常有两个 ...
- 学习光盘刻录必备基础知识
学习光盘刻录必备基础知识 2011年04月11日 [b] 学习光盘刻录必备基础知识[/b] 日期:2009-10-10 11:04 1.什么是CD-R? CD-R就是光盘刻录片(CD Recordab ...
- c语言需要哪些英语基础,学习C语言的必备基础知识(国外英语资料).doc
学习C语言的必备基础知识(国外英语资料) 满卧裹瑟莉筑部获搪肪棱惺杀摄械圭旬敷豹休登悬邱雀报台盼拈毒鹰进怀却恩登雄旁二宇谊婆叔陌嘎扇体歌嫉蹿久题篡憨琵夹涌芦鸣褐颂诅讳拴狸果液梦绸亥氯确杯牌憨耗终贼况榔 ...
- LeetCode 牛客网 C++ 算法 刷题必备基础知识
LeetCode 牛客网 C++ 算法 刷题必备基础知识 {ignore} 文章目录 LeetCode 牛客网 C++ 算法 刷题必备基础知识 {ignore} main综合模板 数组排序库 字符串库 ...
最新文章
- poj2724(二分图匹配)
- h5页面笔按下默认是拖动,H5中在拖动的元素或选择的文本进入到有效的放置目标时触发的事件ondragenter...
- 管理软件售前咨询与企业架构
- Codeforces Round #246 (Div. 2) B. Football Kit
- go爬取json_Python爬取百度文库学习
- react-redux中的connect
- 什么是云计算基础设施?
- OpenCV —数据持久化: FileStorage类的数据存取操作与示例
- 初识ES-IK分词器的拓展和停用词典
- 详细讲解Android的网络通信(HttpUrlConnection和HttpClient)
- 数学题 贪心+二分答案
- redis专题:redis的常用数据结构及使用场景
- Linux用户对System76的Darter Pro笔记本电脑的评论
- win10系统怎么写java_win10系统制作java文本的操作方法
- Android AlarmManager广播接收器和服务
- [转]SQL Collation冲突解决 临时表
- 八皇后--python代码
- android 添加字幕,字幕添加器app-字幕添加器安卓版v2.0.1 - 起点软件园
- 使用Excel拼接SQL语句
- C语言百分号加字母%d%p%o%x%u%c%s%f%e%g代表作用
热门文章
- Java游戏服务器系列:传统的BIO(OIO)、NIO与Netty中的BIO(OIO)、NIO
- Qt引入图标字体包iconfont
- python 日历节假日显示颜色_python判断2018/2019年的某天是否是节假日
- 【新手上路常见问答】关于知识工程
- 直接启动htpp服务
- 2020李宏毅学习笔记——8. Convolution Netural Network
- Supervisor socket.error No such file or directory file /usr/lib64/pyth
- 华为通用软件开发工程师面经(业务主管面挂)
- 爱快路由网关到网关配置open***
- 容器云平台No.10~通过gogs+drone+kubernetes实现CI/CD