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)

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 模块的使用 - 学习笔记的更多相关文章

  1. python3 正则表达式re模块

    正则表达式的功能:字符串的模糊匹配查询import re元字符 . ---->匹配除换行符意外的任意字符 ^ ---->匹配行首位置 $ ---->匹配行尾位置 关于重复的元字符 * ...

  2. python3 正则表达式 re模块之辣眼睛 计算器

    额...学到几个常用模块了,也要其中考试了,每天晚上敲一点,敲得脑壳疼,不过又想到好一点的办法了,有时间再改吧. 此非吾所欲也,实属无奈也....复习之路漫漫,吾将到书上求索,在此不多逗留,我挥一挥衣 ...

  3. co模块源码学习笔记

    // Sorrow.X --- 添加注释,注释纯属个人理解 /** * slice变量 引用 数组的 slice方法 */ var slice = Array.prototype.slice; /** ...

  4. Nginx模块之Nginx-Ts-Module学习笔记(一)抢险体验

    1.通过HTTP接收MPEG-TS2.生产和管理Live HLS 3.按照官方的编译和配置,当然了我是第一次编译没有通过,在作者重新调整下,编译成功,感谢:@arut https://github.c ...

  5. python 排序模块 ———— heapq(学习笔记)

    from heapq import * def heasort(initi):# 排序 h=[] for value in initi: heappush(h,value)#将每一个item进入hea ...

  6. Python学习笔记基础篇——总览

    Python初识与简介[开篇] Python学习笔记——基础篇[第一周]——变量与赋值.用户交互.条件判断.循环控制.数据类型.文本操作 Python学习笔记——基础篇[第二周]——解释器.字符串.列 ...

  7. AVAWEB学习笔记 ---- 系列文章

    [JAVAWEB学习笔记]网上商城实战5:后台的功能模块 [JAVAWEB学习笔记]网上商城实战4:订单模块 [JAVAWEB学习笔记]网上商城实战3:购物模块和订单模块 [JAVAWEB学习笔记]网 ...

  8. python3.4学习笔记(十二) python正则表达式的使用,使用pyspider匹配输出带.html结尾的URL

    python3.4学习笔记(十二) python正则表达式的使用,使用pyspider匹配输出带.html结尾的URL实战例子:使用pyspider匹配输出带.html结尾的URL:@config(a ...

  9. Python3学习笔记(urllib模块的使用)转http://www.cnblogs.com/Lands-ljk/p/5447127.html

    Python3学习笔记(urllib模块的使用)   1.基本方法 urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None,  ...

随机推荐

  1. [板子]Kruskal

    众所周知求最小生成树的两种方法: 1.Kruskal 2.Prim 这里只挂第一种,因为noip掌握第一种就够了. 两种做法的区别可以参考这个博客:http://blog.csdn.net/molln ...

  2. vue新增属性响应式更新的问题

    根据官方文档定义: 如果在实例创建之后添加新的属性到实例上,它不会触发视图更新. 受现代 JavaScript 的限制 (以及废弃 Object.observe),Vue 不能检测到对象属性的添加或删 ...

  3. pytorch 中的数据类型,tensor的创建

    pytorch中的数据类型 import torch a=torch.randn(2,3) b=a.type() print(b) #检验是否是该数据类型 print(isinstance(a,tor ...

  4. 程序员必须掌握的性能调优 X Y Z

    热评博文:<如何设计出优美的Web API?>,现阅读量超 2500,小伙伴们不要错过哦! 2003 ~ 2008 年,这五年老兵哥我在通信行业做实习生和开发岗,主要用 C / C++ / ...

  5. mysql中information_schema.views字段说明

    1.查看视图并不是查询视图数据,而是查看数据库中已经存在的视图的定义,查看视图必须要有SHOW VIEW权限,MySQL的数据库下的user表中存储这这个数据.查看视图的方法有:DESCRIBE,SH ...

  6. java引用类型的浅拷贝与深拷贝理解

    1.浅拷贝 只会复制地址值,也就是同一个对象两个引用,只是复制了一个引用而已. 2.深拷贝 重新在堆里创建一个新对象给新引用,连同地址值也不一样. 首先要知道Object的clone()方法, pub ...

  7. C# event 事件

    事件第二篇:https://www.cnblogs.com/FavoriteMango/p/11731485.html 曾经面试碰到一道设计题: 现有一个人,一群鸟,人有一把手枪,当人开枪时,所有的鸟 ...

  8. Spring超详细总结

    Spring概述 一.简化Java开发 Spring为了降低Java开发的复杂性,采用了以下四种策略 基于POJO的轻量级和最小侵入性编程: 通过依赖注入和面向接口实现松耦合: 基于切面和惯例进行声明 ...

  9. 跟我一起学QT_QT标准对话框_字体选择框

    标准对话框 QT的标准对话框分为以下几种 颜色对话框 文件对话框 字体对话框 输入对话框 消息对话框 进度对话框 错误信息对话框 向导对话框 字体选择框 字体选择框位于 QFontDialog 类中 ...

  10. 【题解】NOIP2017逛公园(DP)

    [题解]NOIP2017逛公园(DP) 第一次交挂了27分...我是不是必将惨败了... 考虑这样一种做法,设\(d_i\)表示从该节点到n​节点的最短路径,\(dp(i,k)\)表示从\(i\)节点 ...