Cooking Regex微信公众号
正则表达式学习

目录

re.match

re.fullmatch

re.search

re.sub

re.subn

re.split

re.findall

re.finditer

re.compile

re.purge

re.escape


阅读本文章时,已默认您对正则表达式有了一定的了解。该教程是对Python的re模块的介绍及注意点提示,希望对您有一定的帮助,如果有解释不到位的地方,还请各位朋友帮忙指出,大家一起进步。好了,那就让我们开始Python正则之旅吧!

最好的学习资料是官方文档,那我们先来看下Python文档里面的介绍,我的版本是Python3.7.2。

import re
help(re)

可以看到目前的Python版本re模块里面包含了以下几个正则相关的方法:

现在我们就按这个顺序来介绍下这几个方法。


re.match

根据官方的介绍,我们可以知道该方法有三个参数 :

  • pattern 表示传进来的正则表达式
  • string 表示被匹配的字符串
  • flags 正则表达式匹配的模式

如下,目前支持7种模式:

对应的中文解释

  • A  该模式会让正则表达式以ASCII字符集去匹配字符串,而不是以Unicode。主要影响的正则有
\w、\W、\d、\D、\b、\B
  • I  忽略大小写
  • L 该模式会使以下正则根据本地环境去匹配
\w、\W、\b、\B
  • M 多行模式匹配,影响^和$
  • S 会使.元字符匹配所有字符,包括换行符
  • X 忽略空白符和注释,主要用于书写正则的格式,添加注释等,为了更好的解释所写的正则
  • U 根据Unicode字符集匹配字符串

接下来,我们就用代码来验证该方法:

该方法是从字符串的起始位置开始匹配字符串。如果匹配上,则会返回一个对象,否则返回None

来看两个例子,你就明白了

demo1

import re
result=re.match(r"\d+","abc123")
print(result)

结果如下:

None

demo2

import re
result=re.match(r"\d+","123abc")
print(result)

<re.Match object; span=(0, 3), match='123'>

看到这里,我想你应该明白re.match这个方法的用法了吧。后面我们会把该方法和re.search做比较。现在我们再来看看,返回的这个Match对象对应的类的一个介绍。

在这里可以看到,re.match()和re.search()返回的结果都是Match这个类的一个实例 对象

下图是该类的几个比较常用的方法:


re.fullmatch

该方法需要整个字符串跟正则完全匹配才会返回一个Match对象,否则返回None

demo1

import re
result=re.fullmatch(r"\d+","123abc")
print(result)

结果:

None

demo2

import re
result=re.fullmatch(r"\d+","123")
print(result)

<re.Match object; span=(0, 3), match='123'>


re.search

该方法会根据传入的正则去扫描整个字符串,若能找到对应的子字符串,则返回该Match对象,否则返回None。这里返回的Match对象保存的是从左到右匹配到的第一个子字符串的信息。

demo1

import re
result=re.search(r"\d+","abc123")
print(result)

<re.Match object; span=(3, 6), match='123'>

demo2

import re
result=re.search(r"\d+","abc1kkk")
print(result)

<re.Match object; span=(3, 4), match='1'>

demo3

import re
result=re.search(r"\d+","abckkk")
print(result)

None

可以看到,re.match和re.search都是在字符串中查找字符串,但区别是

  • re.match 字符串的开始位置的字符串必须匹配该正则,否则返回None。你可以理解为startWith的意思
  • re.search 从左到右匹配,只要字符串中的任意一个子串能匹配到该正则,则返回匹配到的第一个子字符串的信息。你可以理解为包含的意思

来看几个等价的demo

import re
result=re.search(r"\A\d+","abc1kkk")
print(result)
result=re.match(r"\d+","abc1kkk")
print(result)
result=re.search(r"^\d+","abc1kkk")
print(result)

上面这几个代码的执行结果的一样的,代码所表示的含义也是一样的。寻找的是开头位置的数字

re.sub

这个方法的作用是字符串替换,其中,rep1可以是字符串,也可以是一个方法。

  • 当rep1是一个字符串时,里面的转义字符会被加工处理。这里怎么理解呢?也就是说,是特殊符号的,会被转为对应的意思,rep1里面的\n会被处理为换行符,\r会被处理成回车换行符,不确定的转义符不会处理,例如\&等。如果是向后引用的,则会替换成对应的引用组捕获的内容,例如,\1会被替换成group(1)的内容,\2会被替换成group(2)的内容。
  • 当rep1是一个方法时,该方法的入参是一个Match对象,并且必须有返回值

rep1为字符串时的例子如下:

import re
#在每个匹配结果前后加上-
result=re.sub(r"(\d+)",r"-\1-","abc1kk2k")
print(result)
#错误的写法,rep1前面没有加r
result=re.sub(r"(\d+)","-\1-","abc1kk2k")
print(result)

abc-1-kk-2-k
abc--kk--k

结果分析,从结果上面可以看到,当rep1字符串前面没有加上r标识符的时候,里面的\1会被按特殊字符处理为它表示的意思,而加上r标识符之后,结果才是正常的。当然,你可以像下面这么写:

import re
result=re.sub(r"(\d+)","-\g<1>-","abc1kk2k")
print(result)
result=re.sub(r"(\d+)",r"-\g<1>-","abc1kk2k")
print(result)
result=re.sub(r"\d+",r"-\g<0>-","abc1kk2k")
print(result)
result=re.sub(r"\d+","-\g<0>-","abc1kk2k")
print(result)
result=re.sub(r"(?P<num>\d+)",r"-\g<num>-","abc1kk2k")
print(result)
result=re.sub(r"(?P<num>\d+)","-\g<num>-","abc1kk2k")
print(result)

那如果我们需要把匹配到的每个数字加1,要怎么写呢?这个时候就需要在rep1传入一个function方法了:

demo1

import re
def add(m):return str(int(m.group())+1)
result=re.sub(r"\d+",add,"abc1kk2k")
print(result)

demo2

import re
result=re.sub(r"\d+",lambda m:str(int(m.group())+1),"abc1kk2k")
print(result)

demo3

import re
result=re.sub(r"(?P<num>\d+)",lambda m:str(int(m.group("num"))+1),"abc1kk2k")
print(result)

re.subn

该方法除了会多返回一个替换次数的结果外,其他功能都与sub一样。返回结果是一个tupl

import re
result=re.subn(r"(\d+)",r"-\1-","abc1kk2k4")
print(result)
result=re.sub(r"(\d+)",r"-\1-","abc1kk2k4")
print(result)result=re.subn(r"(\d+)",r"-\1-","abc1kk2k4",2)
print(result)
result=re.sub(r"(\d+)",r"-\1-","abc1kk2k4",2)
print(result)

结果:

('abc-1-kk-2-k-4-', 3)
abc-1-kk-2-k-4-
('abc-1-kk-2-k4', 2)
abc-1-kk-2-k4

re.split

如果pattern没有捕获组的话,则按照正则分割后,返回一个list结果集;如果pattern里面包含捕获组的话,list结果集里面包含捕获组获取到的内容

import re
result=re.split(r"\d+","abc11kk22k34")
print(result)
result=re.split(r"(\d+)","abc11kk22k34")
print(result)result=re.split(r"\d+","abc11kk22k34",2)
print(result)
result=re.split(r"(\d+)","abc11kk22k34",2)
print(result)

['abc', 'kk', 'k', '']
['abc', '11', 'kk', '22', 'k', '34', '']
['abc', 'kk', 'k34']
['abc', '11', 'kk', '22', 'k34']

re.findall

  • pattern 没有捕获组的话,该方法会返回所有匹配结果的list
  • pattern 包含一个或多个捕获组的话,list保存的结果是这些捕获组的匹配结果,且list里面的各项都是一个tuples
import re
result=re.findall(r"[a-z]+\d+","abc11kk22k34")
print(result)
result=re.findall(r"[a-z]+(\d+)","abc11kk22k34")
print(result)
result=re.findall(r"([a-z]+)(\d+)","abc11kk22k34")
print(result)
result=re.findall(r"([a-z]+)(\d+)()()()","abc11kk22k34")
print(result)

['abc11', 'kk22', 'k34']
['11', '22', '34']
[('abc', '11'), ('kk', '22'), ('k', '34')]
[('abc', '11', '', '', ''), ('kk', '22', '', '', ''), ('k', '34', '', '', '')]

re.finditer

返回一个迭代器,迭代器里面的每个对象都是Match类型的数据

import re
result=re.finditer(r"\d+","abc11kk22k34")
for m in result:print(m.group(0))
print()
result=re.finditer(r"(\d+)","abc11kk22k34")
for m in result:print(m.group(0))print(m.group(1))

re.compile

编译正则,返回一个Pattern对象。 这样做的目的是可以重复使用该正则模式对象

该Pattern类有如下方法

re.purge

清除正则表达式缓存

re.escape

转义特殊字符,就是把有特殊意义的字符串转义为普通字符串

Python正则re模块详解相关推荐

  1. python之sys模块详解_(转)python之os,sys模块详解

    python之sys模块详解 原文:http://www.cnblogs.com/cherishry/p/5725184.html sys模块功能多,我们这里介绍一些比较实用的功能,相信你会喜欢的,和 ...

  2. 【Python】python之subprocess模块详解

    [Python]python之subprocess模块详解 subprocess模块 subprocess是Python 2.4中新增的一个模块,它允许你生成新的进程,连接到它们的 input/out ...

  3. Python的pickle模块详解(包括优缺点及和JSON的区别)

    文章目录 一.pickle是什么? 1.pickle的优缺点 2.pickle和JSON的区别 3.pickle的应用总结 二.pickle的用法 1. pickle接口 2. pickle实例 结语 ...

  4. python中logging模块详解_python logging日志模块详解

    logging 日志模块详解 用Python写代码的时候,在想看的地方写个print xx 就能在控制台上显示打印信息,这样子就能知道它是什么了,但是当我需要看大量的地方或者在一个文件中查看的时候,这 ...

  5. python当中时间模块详解,包括time,timeit,datatime

    目录 time 模块 -- 时间获取和转换 以下三个比较常见: time.perf_counter() time.process_time() time.sleep(secs) timeit 模块详解 ...

  6. Python的PyYAML模块详解

    文章目录 注:原文链接 简介 安装 简单安装 从源码安装 最常被问到的问题 使用详解 加载YAML 转储YAML 构造.表示和解析 YAML语法 文档 块序列 块映射 流集合 标量 别名 标签 YAM ...

  7. python之re模块详解

    re模块 功能:用来匹配字符串(动态.模糊的匹配),爬虫用的多. 一.常用方法: match():从头匹配 search():从整个文本搜索 findall():找到所有符合的 split():分割 ...

  8. Python中time模块详解

    转载自:http://qinxuye.me/article/details-about-time-module-in-python/ 在平常的代码中,我们常常需要与时间打交道.在Python中,与时间 ...

  9. Python os.path() 模块 详解 附算例

    Python os.path() 模块 函数 说明 os.path.abspath(path) 返回绝对路径 os.path.basename(path) 返回文件名 os.path.commonpr ...

最新文章

  1. SLAM的通用框架:GSLAM
  2. 业务系统性能优化——缓存
  3. 【Python学习系列二十】scikit-learn库模型持久化
  4. oracle 日志注册,Oracle日常维护中管理用户以及重做日志文件的方法
  5. pycharm里怎么关闭一个项目_【周末分享】一个完整的项目复盘到底要怎么做?...
  6. c语言行列倒置算法,循环行列的元素倒置。求指点
  7. 自己动手,实现一种类似ListT的数据结构(二)
  8. 算法3-------最长子序列和
  9. P2023 [AHOI2009]维护序列
  10. AAuto如何设置定时器
  11. Nhibernate3.3.3sp1基础搭建测试
  12. matlab习题二,matlab习题二答案.doc
  13. 开放源代码是如何吞噬软件的
  14. CAN总线之总线逻辑值
  15. 《幸福来敲门》观后感
  16. ABAP BDC使用EXCEL模板批量修改物料
  17. 017~022 函数 课后练习题
  18. 设计原则:里式替换原则(LSP)
  19. 调用高德地图Api实现通过地址转经纬度
  20. 圆形标定板_机器视觉学习笔记(2)--如何检测圆点标定板

热门文章

  1. 1万小时缔造的世界第一程序员
  2. 利用四位共阳数码管显示小数
  3. 【node.js】一个基于HTPP的服务
  4. 基于python的Django框架 企业公司网站设计与实现毕业设计毕设参考
  5. linux网络测速qerf,kehu.one在线网速测试,网站测速工具,测网速,网站访问速度测试-boce.com...
  6. Win10系统重置后键盘鼠标都失灵,光标都不显示怎么解决?
  7. BurpSuite-Collaborator插件介绍 附最新burp破解版地址
  8. 猿创征文 | Git的良心教程
  9. 代码审计| HDWiki 漏洞(一)
  10. 第三届全国大学生算法设计与编程挑战赛 (冬季赛)部分题解