2024 Python3.10 系统入门+进阶(十六):正则表达式

打印 上一主题 下一主题

主题 701|帖子 701|积分 2103

正则表达式黑白常强盛的字符串操作工具,其语法形式为一个特别的字符序列,常用来对字符串举行匹配操作。Python 从 1.5 版本开始新增 re 模块,提供 Perl 风格的正则表达式支持。本文将详细介绍正则表达式的根本语法,以及 Python 正则表达式尺度库的根本用法。
【学习重点】

  • 了解正则表达式的相关概念。
  • 掌握正则表达式的根本语法。
  • 熟悉 Python 的 re 模块。
  • 能够使用正则表达式办理实际标题。
一、熟悉正则表达式

正则表达式又称规则表达式(Regular Expression),在代码中简写为 regex、regexp 或 RE,通常被用来匹配符合指定模式(规则)的文本。当代盘算机编程语言都支持利用正则表达式举行字符串操作。实际上,正则表达式就是一种逻辑模板,是用事先定义好的一组特定字符,以及这些特定字符的任意组合,组成一个 "正则表达式字符串", 这个 "正则表达式字符串" 用来表达对字符串的一种过滤逻辑。
给定一个正则表达式和一个被操作的字符串,可以到达以下目的:

  • 验证被操作字符串是否符合正则表达式的匹配逻辑。
  • 通过正则表达式,从被操作字符串中获取特定的信息,或者修改字符串。
Python 支持 Perl 风格的正则表达式语法。下面先了解与正则表达式相关的几个概念:

  • grep:grep 是一种强盛的文本搜刮工具,它能使用特定模式匹配(包括正则表达式)搜刮文本,并默认输出匹配行。
  • egrep:由于 grep 更新的速度无法与技术更新的速度同步。为此,贝尔实行室推出了 egrep,即扩展的 grep,这大大增强了正则表达式的能力。
  • POSIX:在 grep 发展的同时,其他一些开发人员也根据自己的喜欢开发出了具有独特风格的版本。但标题也随之而来,有的步伐支持某个元字符,而有的步伐则不支持,因此就有了 POSIX。POSIX 是一系列尺度,确保了操作系统之间的可移植性。但 POSIX 和 SQL 一样没有成为最终的尺度,而只能作为一个参考。
  • Perl: 1987年,Larry Wall 发布了 Perl 编程语言,它汲取了多种语言英华,并内部集成了正则表达式的功能,以及巨大的第三方代码库 CPAN。Perl 履历了从 Perl 1 到现在 Perl 6 的发展最终成了 POSIX 之后的另一个尺度。
  • PCRE:1997 年,Philip Hazel 开发了 PCRE 库,它是能够兼容 Perl 正则表达式的一套正则引擎,其他开发人员可以将 PCRE 整合到自己的语言中,为用户提供丰富的正则功能。
参考:https://www.w3cschool.cn/regex_rmjc/
分类:
  1. 1.BRE。基本正则表达式,grep、sed、vi等软件支持。vim有扩展。
  2. 2.ERE。扩展正则表达式,egrep(grep -E)、sed -r等。
  3. 3.PCRE。几乎所有高级语言都是PCRE的方言或者变种。Python从1.6开始使用SRE正则表达式引擎,可以认为是PCRE的子集,见模块re。
复制代码
二、正则表达式根本语法

在形式语言理论中,正则表达式被称为 "规则语言",而不是编程语言。在 Python 中,"正则表达式" 这个概念包含两层含义:一个是正则表达式字符串;另一个是正则表达式对象。正则表达式字符串是正则表达式的文本表示,它经过编译后就成为正则表达式对象。正则表达式对象具有匹配功能。正则表达式字符串由两部分构成:元字符宁静凡字符。元字符是具有特别含义的字符,如 ".""?",平凡字符是仅指代自身的平凡字符,如数字、字母等。本小节将详细介绍各种元字符的含义和用法。
由于在这里我们还没有学习 re 模块,我们通过一个工具来学习正则表达式的根本语法,如下图所示:

软件下载地点:
  1. 通过网盘分享的文件:正则表达式
  2. 链接: https://pan.baidu.com/s/1TeYRnx1QkgHY6rfxlSQ9Jw?pwd=1946 提取码: 1946
  3. --来自百度网盘超级会员v9的分享
  4. 网盘中带有一些正则表达式的文档资料,不需要可以直接下载 正则表达式编写及调试工具.msi 软件
复制代码
2.1 行界定符

行界定符描述一行字符串的边界,具体说明如下:
  1. ^: 表示行的开始
  2. $: 表示行的结尾
  3. 在多行匹配模式中,行定界符能够匹配每一行的行首和行尾位置。
  4. ① 单行模式: .可以匹配所有字符,包括换行符,^ 表示整个字符串的开头,$整个字符串的结尾
  5. ② 多行模式: .可以匹配除了换行符之外的字符,多行不影响.点号。^ 表示行首,$行尾,只不过这里的行是每一个行 ⇒ re.MULTILINE
  6. ③ 默认模式: 可以看做待匹配的文本是一行,不能看做多行,.点号不能匹配换行符,^和$表示行首和行尾,
  7. 而行首行尾就是整个字符串的开头和结尾
  8. ④ 单行模式: 基本和默认模式一样,只是.点号终于可以匹配任意一个字符包括换行符,这时所有文本就是一个长长的只有一行的字符串。
  9. ^就是这一行字符串的行首,$就是这一行的行尾。
  10. ⑤ 多行模式: 重新定义了行的概念,但不影响.点号的行为,^和$还是行首行尾的意思,只不过因为多行模式可以识别换行符了。
  11. "开始"指的是\n后紧接着下一个字符;"结束"指的是\n前的字符,注意最后一行结尾可以没有\n
  12. 简单讲,单行模式只影响.点号行为,多行模式重新定义行影响了^和$
  13. 注意: 注意字符串中看不见的换行符,\r\n会影响e$的测试,e$只能匹配e\n
复制代码
示例1:.$ 指的是此行的结尾,而默认模式和单行模式都是一行,指的是这个大字符串的最后一个字符,就是 key 的 y。如下图所示:

示例2:上面第一行 happy 之后,有可能是 \r\n 结尾。y$ 单行匹配 key 的 y,多行匹配 happy 和 key 的 y。如下图所示:


留意: 都是选择 全部匹配 举行测试。假如选择 匹配,则默认只匹配一次,即使是多行模式,也只会匹配上一个 y。如下图所示:

2.2 单词定界符

单词定界符描述一个单词的边界,具体说明如下:
  1. \b: 表示单词边界
  2. \B: 表示非单词边界
  3. ps: 在正则表达式中,单词是由26个字母(含大小写)和10个数字组成的任意长度且连续的字符串。
  4. 单词与非单词类字符相邻的位置称为单词边界。
复制代码
示例1:使用 \b 定界符匹配一个完整的 "htm" 单词。如下图所示:

2.3 字符类

字符类也称为字符集,就是一个字符列表,表示匹配字符列表中的任意一个字符。使用方括号([…])可以定义字符类。例如,[abc],可以匹配 a、b、c 中的任意一个字母。
示例1:下面正则表达式定义了匹配 html、HTML、Html、hTml 或 HTml 的字符类。

全部的特别字符在字符会集都失去了其原有的特别含义,仅表示字符自己。在字符会集假如要使用 [、]、-^,可以在 []-^ 字符前面加上反斜杠,或者把 []- 放在字符会集第 1 个字符位置,把 ^ 放在非第 1 个字符位置。下图正则表达式可以匹配一些特别字符:

2.4 选择符

选择符类似字符类,可以实现选择性匹配。使用 "|" 可以定义选择匹配模式,类似 Python 运算中的逻辑或。"|" 代表左右表达式任意匹配一个,它总是先实验匹配左侧的表达式,一旦乐成匹配,则跳出匹配右边的表达式。假如 "|" 没有被包括在小括号中,则它的匹配范围是整个正则表达式。
示例1:下面字符模式可以匹配 html,也可以匹配 Html。

加小括号,如下图所示:

2.5 范围符

使用字符类须要罗列全部可选字符,当可选字符比力多时就比力贫苦。不过,在字符类中可以使用连字符 "-" 定义字符范围。连字符左侧字符为范围起始点,右侧字符为范围终止点。字符范围都是根据字符编码表的位置关系来确定的。示例:
  1. '[a-z]'  # 匹配任意一个小写字母
  2. '[A-Z]'  # 匹配任意一个大写字母
  3. '[0-9]'  # 匹配任意一个数字
  4. '[\u4e00-\u9fa5]'  # 匹配中文字符
  5. '[\x00-\xff]'  # 匹配单字节字符
  6. '[a-zA-Z0-9\u4e00-\u9fa5\x00-\xff]'  # 也可以连着写
复制代码
2.6 扫除符

在字符类中,除了范围符外,尚有一个元字符:扫除符 (^)。将 '^' 放到方括号内最左侧,表示扫除字符列表,也就是将反转该集合的意义。类似 Python 运算中的逻辑非。示例:
  1. '[^0-9]'  # 匹配任意一个非数字
  2. '[^\x00-\xff]'  # 匹配非单字节字符
复制代码
2.7 限定符

限定符也称为数目词,用来指定正则表达式的一个给定字符、字符类或子表达式必须要出现多少次才气满足匹配。具体说明如下表所示:

2.8 任意字符

点号(".")能够匹配除换行符 "\n" 之外的任何单字符。假如要匹配点号(".")自己,须要使用 "\" 举行转义。留意:re.DOTALL 模式下也能够匹配换行符。
示例:使用点号元字符匹配字符串 "gooooooogle" 中前面 6 个字符。

2.9 转义字符

转义字符 "\" 能够将特别字符变为平凡字符,如 "./*/^/$" 等,其功能与 Python 字符串中的转义字符类似。假如把特别字符放在中括号内定义字符集,也能够把特别字符变成平凡字符,如
  • 等效于 \*,都可以用来匹配字符 *
    2.10 反斜杠

    反斜杠字符 "\" 除了能够转义之外,还具有其他功能,具体说明如下:

    • 定义非打印字符,具体说明如下表所示:

    • 预定义字符集,具体说明如下表所示:

    • 定义断言的限定符,具体说明如下表所示:

    2.11 小括号

    在正则表达式中,小括号有两个作用,简单说明如下。
    2.11.1 定义独立单元

    小括号可以改变选择符和限定符的作用范围。示例:
    1. '(h|H)html'
    2. '(goo){1,3}'
    复制代码
    在上面代码中,第 1 行正则表达式定义选择符范围为两个字符,而不是整个正则表达式;第 2 行正则表达式定义限定符限定的是 3 个字符,而不仅仅是左侧的第一个字符。
    2.11.2 分组

    小括号的第 2 个作用就是分组,即定义子表达式,子表达式相称于一个独立的正则表达式,后面要学到的反向引用与子表达式有直接的关系。子表达式能够临时存储其匹配的字符,然后可以在后面举行引用。正则表达式允许多次分组、嵌套分组,从表达式左边开始,第一个左括号 "(" 的编号为1,然后每遇到一个分组的左括号 "(",编号就加1。例如:
    1. '(a(b(c)))'
    复制代码
    上面表达式中,编号1的子表达式为abc,编号2的子表达式为bc,编号3的子表达式为c。除了默认的编号外,也可以为分组定义一个别名。语法格式如下:
    1. (?P<name>...)
    2. # 例如下面的表达式可以匹配字符串 abcabcabc
    3. (?P<id>abc){3}
    复制代码
    2.12 反向引用

    在正则表达式,假如遇到分组,将导致子表达式匹配的字符被存储到一个临时缓冲区中,所捕获的每个子匹配都按照正则表达式中从左至右的顺序举行编号,从 1 开始,连续编号直至最大 99 个子表达式。每个缓冲区都可以使用 "\n" 访问,此中 n 为一个标识特定缓冲区的编号。示例:

    对于正则表达式 "([ab])\1",子表达式 "[ab]",虽然可以匹配 'a' 或者 'b',但是捕获组一旦匹配乐成,反向引用的内容也就确定了。假如捕获组匹配到 'a',那么反向引用也只能匹配 'a',同理,假如捕获组匹配到 'b',那么反向引用也只能匹配 'b'。由于后面反向引用 '\1' 的限制,要求必须是两个相同的字符,在这里也就是 'aa' 或者 'bb' 才气匹配乐成。
    2.13 特别构造

    小括号不仅可以分组,也可以构造特别的结构,具体说明如下:

    • 使用下面语法可以设计小括号不分组,仅作为独立单元用于 '|' 或重复匹配。
      1. (?:...)
      2. # 例如,下面表达式仅用于界定逻辑作用范围,不用来分组
      3. (?:\w)*  # 匹配0个或多个单词字符
      4. (?:html|htm)  # 匹配html,或者匹配htm
      复制代码
    • 定义匹配模式,使用下面语法可以定义表达式的匹配模式。
      1. (?aiLmsux)正则表达式字符串
      2. aiLmsux 中的每个字符代表一种匹配模式,具体说明参考 2.14 匹配模式 小节介绍
      3. (?aiLmsux)只能够用在正则表达式的开头,可以多选。例如,下面表达式可以匹配a,也可以匹配A.
      4. (?i)a
      复制代码
    • 解释:使用下面语法可以在正则表达式中添加解释信息,"#" 后面的文本作为解释内容将被忽略掉。
      1. (?#注释信息)
      2. 例如,在下面表达式中添加一句注释,以便表达式阅读和维护
      3. a(?#匹配字符 abc)bc
      4. 上面表达式仅匹配字符串abc,小括号内的内容将被忽略
      复制代码
    • 正前瞻,使用下面语法可以定义表达式后面必须满足特定的匹配条件。
      1. (?=...)
      2. # 例如,下面表达式仅匹配后面包含数字的字母a
      3. a(?=\d)
      4. # 后向匹配仅作为一个限定条件,其匹配的内容不作为表达式的匹配结果。
      复制代码
    • 负前瞻:使用下面语法可以定义表达式后面必须不满足特定的匹配条件。
      1. (?!...)
      2. # 例如,下面表达式仅匹配后面不包含数字的字母a
      3. a(?!\d)  # 后向不匹配仅作为一个限定条件,其匹配的内容不作为表达式的匹配结果。
      复制代码
    • 正回顾:使用下面语法可以定义表达式前面必须满足特定的匹配条件。
      1. (?<=...)
      2. # 例如,下面表达式仅匹配前面包含数字的字母a
      3. (?<=\d)a  # 前向匹配仅作为一个限定条件,其匹配的内容不作为表达式的匹配结果。
      复制代码
    • 负回顾:使用下面语法可以定义表达式前面必须不满足特定的匹配条件。
      1. (?<!...)
      2. # 例如,下面表达式仅匹配前面不包含数字的字母a
      3. (?<!\d)a  # 前向不匹配仅作为一个限定条件,其匹配的内容不作为表达式的匹配结果。
      复制代码
    • 条件匹配:使用下面语法可以定义条件匹配表达式。
      1. (?(id/name)yes-pattern|no-pattern)
      2. id: 表示分组编号
      3. name: 表示分组的别名,如果对应的分组匹配到字符,则选择 yes-pattern子表达式执行匹配
      4. 如果对应的分组没有匹配字符,则选择 no-pattern 子表达式执行匹配
      5. |no-pattern: 可以省略,直接写成语法: (?(id/name)yes-pattern)
      复制代码
    2.14 匹配模式

    正则表达式可以包含一些可选的标志修饰符,用来控制匹配的模式。修饰符重要用来调解正则表达式的解释,扩展正则表达式在匹配、更换等操作时的某些功能,增强了正则表达式的能力。差别的语言都有自己的模式设置,Python 中的重要模式修饰符说明如下表所示:

    这些标志修饰符重要用在正则表达式处置惩罚函数的 flag 参数中,为可选参数。多个标志可以通过按位 OR(|) 来指定,如 re.I|re.M,被设置成 I 和 M 标志。
    三、re模块

    Python 提供了 re 模块用于实现正则表达式的操作。在实现时,可以使用 re 模块提供的方法,如 search()、match()、findall() 等,举行字符串处置惩罚,也可以先使用 re 模块的 compile() 方法将模式字符串转换为正则表达式对象,然后再使用该正则表达式对象的相关方法来操作字符串。re 模块在使用时,须要先用 import 语句引入,具体代码如下:
    1. import re
    复制代码
    3.1 compile()方法——编译为正则表达式对象

    compile() 方法用于编译正则表达式模式,返回一个对象的模式。然后可以通过 RegexObject 对象调用 match() 和 search() 等方法。语法格式如下:
    1. In [7]: re.compile?
    2. Signature: re.compile(pattern, flags=0)
    3. Docstring: Compile a regular expression pattern, returning a Pattern object.
    4. File:      f:\dev_tools\python\python310\lib\re.py
    5. Type:      function
    6. 参数说明:
    7. 1.pattern: 编译时用的表达式字符串。
    8. 2.flags: 编译标志位,用于修改正则表达式的匹配方式,如是否区分大小写、多行匹配等。
    9. 3.返回值: 返回一个正则表达式对象。
    复制代码
    示例:查找包含指定字母的单词。使用compile()方法创建一个可以查找包含指定字母对应单词的正则表达式对象,并输出符合条件的英文单词,代码如下:
    1. # -*- coding: utf-8 -*-# @Time    : 2024-09-25 9:50# @Author  : AmoXiang# @File: re_demo.py# @Software: PyCharm# @Blog: https://blog.csdn.net/xw1680import re
    2.   # 导入正则表达式re模块# 须要匹配的字符串string = "Tina is a good girl, she is cool, clever, and so on..."match = re.compile(r'\w*oo\w*')  # 创建正则表达式对象print(match.findall(string))  # 打印全部包含"oo"的单词
    复制代码
    3.2 escape()方法——转义特别字符

    escape() 方法用于对字符串中的非字母数字举行转义。语法格式如下:
    1. In [8]: re.escape?
    2. Signature: re.escape(pattern)
    3. Docstring: Escape special characters in a string.
    4. File:      f:\dev_tools\python\python310\lib\re.py
    5. Type:      function
    6. 参数说明:
    7. 1.pattern: 表示模式字符串,由要匹配的正则表达式转换而来。
    8. 2.返回值: 返回转义后的字符串。
    复制代码
    示例:对字符串中的非字母数字举行转义。使用escape()方法实现对字符串中的非字母数字举行转义,代码如下:
    1. # -*- coding: utf-8 -*-# @Time    : 2024-09-25 9:50# @Author  : AmoXiang# @File: re_demo.py# @Software: PyCharm# @Blog: https://blog.csdn.net/xw1680import re
    2.   # 导入正则表达式re模块# 须要转义的字符串string = 'abcdefghijklmnopqrstuvwxyz0123456789!#$%&*+-.^_`|~'# abcdefghijklmnopqrstuvwxyz0123456789!\#\$%\&\*\+\-\.\^_`\|\~print(re.escape(string))  # 打印转义后的字符串
    复制代码
    3.3 f indall()方法——搜刮全部符合正则表达式的字符串

    findall() 方法用于在整个字符串中搜刮全部符合正则表达式的字符串,并以列表的形式返回。假如匹配乐成,则返回包含匹配结构的列表,否则返回空列表。语法格式如下:
    1. In [9]: re.findall?
    2. Signature: re.findall(pattern, string, flags=0)
    3. Docstring:
    4. Return a list of all non-overlapping matches in the string.
    5. If one or more capturing groups are present in the pattern, return
    6. a list of groups; this will be a list of tuples if the pattern
    7. has more than one group.
    8. Empty matches are included in the result.
    9. File:      f:\dev_tools\python\python310\lib\re.py
    10. Type:      function
    11. 参数说明:
    12. 1.pattern: 表示模式字符串,由要匹配的正则表达式转换而来。
    13. 2.string: 表示要匹配的字符串。
    14. 3.flags: 可选参数,表示标志位,用于控制匹配方式,如是否区分字母大小写。
    15. 4.返回值: 返回一个符合表达式匹配结果的列表。
    复制代码
    示例:搜刮以“mr_”开头的字符串。使用findall()方法搜刮以“mr_”开头的字符串,代码如下:
    1. # -*- coding: utf-8 -*-# @Time    : 2024-09-25 9:50# @Author  : AmoXiang# @File: re_demo.py# @Software: PyCharm# @Blog: https://blog.csdn.net/xw1680import re
    2.   # 导入正则表达式re模块pattern = r'mr_\w+'  # 模式字符串string = 'MR_SHOP mr_shop'  # 要匹配的字符串match = re.findall(pattern, string, re.I)  # 搜刮字符串,不区分大小写print(match)  # 打印匹配效果 ['MR_SHOP', 'mr_shop']string = '项目名称MR_SHOP mr_shop'match = re.findall(pattern, string)  # 搜刮字符串,区分大小写print(match)  # 打印匹配效果 ['mr_shop']
    复制代码
    3.4 f inditer()方法——找到所匹配的全部子串

    finditer() 方法和 findall() 方法类似,它的功能为在字符串中找到正则表达式所匹配的全部子串,但是把它们作为一个迭代器返回。语法格式如下:
    1. In [10]: re.finditer?
    2. Signature: re.finditer(pattern, string, flags=0)
    3. Docstring:
    4. Return an iterator over all non-overlapping matches in the
    5. string.  For each match, the iterator returns a Match object.
    6. Empty matches are included in the result.
    7. File:      f:\dev_tools\python\python310\lib\re.py
    8. Type:      function
    9. 参数说明:
    10. 1.pattern: 表示匹配的正则表达式。
    11. 2.string: 表示要匹配的字符串。
    12. 3.flags: 表示标志位,用户控制正则表达式的匹配方式,如是否区分大小写、多行匹配等。
    13. 4.返回值: 返回一个符合表达式匹配结果的迭代器。
    复制代码
    示例:获取字符串中的数字。使用finditer()方法获取字符串中的全部数值,代码如下:
    1. # -*- coding: utf-8 -*-# @Time    : 2024-09-25 9:50# @Author  : AmoXiang# @File: re_demo.py# @Software: PyCharm# @Blog: https://blog.csdn.net/xw1680import re
    2.   # 导入正则表达式re模块# 获取字符串中的数字it = re.finditer(r"\d+", "12a32bc43jf3")# 便利获取后的迭代对象for match in it:    print(type(match), match)  # <class 're.Match'> <re.Match object; span=(3, 5), match='32'>    print(match.group())  # 打印数字 12 32 43 3
    复制代码
    3.5 fullmatch()方法——对整个字符串举行匹配

    fullmatch() 方法用于对整个字符串举行匹配,假如整个字符串匹配到正则表达式样式,就返回一个相应的匹配对象,否则就返回一个 None。语法格式如下:
    1. In [11]: re.fullmatch?
    2. Signature: re.fullmatch(pattern, string, flags=0)
    3. Docstring:
    4. Try to apply the pattern to all of the string, returning
    5. a Match object, or None if no match was found.
    6. File:      f:\dev_tools\python\python310\lib\re.py
    7. Type:      function
    8. 参数说明:
    9. 1.pattern: 表示模式字符串,由要匹配的正则表达式转换而来。
    10. 2.string: 表示要匹配的字符串。
    11. 3.flags: 可选参数,表示标志位,用于控制匹配方式,如是否区分字母大小写。
    12. 4.返回值: 如果整个 string 匹配到正则表达式样式,就返回一个相应的 Match 对象。
    复制代码
    示例:匹配整个字符串。使用fullmatch()方法实现匹配整个字符串,代码如下:
    1. # -*- coding: utf-8 -*-# @Time    : 2024-09-25 9:50# @Author  : AmoXiang# @File: re_demo.py# @Software: PyCharm# @Blog: https://blog.csdn.net/xw1680import re
    2.   # 导入正则表达式re模块string1 = "mr00soft"  # 须要匹配的字符串# 匹配包括下划线在内的任何字符,并匹配前面的子表达式一次或多次match1 = re.fullmatch('\w+', string1)# 单个字符匹配任意次,贪婪匹配match2 = re.fullmatch('.*', string1)# 匹配多个数字match3 = re.fullmatch('\d+', string1)print(match1)  # <re.Match object; span=(0, 8), match='mr00soft'>print(match2)  # <re.Match object; span=(0, 8), match='mr00soft'>print(match3)  # None
    复制代码
    3.6 match()方法——从字符开始处举行匹配

    match() 方法用于从字符串的开始处举行匹配,假如在起始位置匹配乐成,则返回 Match 对象,否则返回 None。语法格式如下:
    1. In [12]: re.match?
    2. Signature: re.match(pattern, string, flags=0)
    3. Docstring:
    4. Try to apply the pattern at the start of the string, returning
    5. a Match object, or None if no match was found.
    6. File:      f:\dev_tools\python\python310\lib\re.py
    7. Type:      function
    8. 参数说明:
    9. 1.pattern: 表示模式字符串,由要匹配的正则表达式转换而来。
    10. 2.string: 表示要匹配的字符串。
    11. 3.flags: 可选参数,表示标志位,用于控制匹配方式,如是否区分字母大小写。
    12. 4.返回值: 如果 string 的开始处有 0 或多个字符匹配到了正则表达式样式,就返回一个相应的Match 对象。
    复制代码
    示例:判断匹配字符串是否以“mr_”开头。使用match()方法判断匹配字符串是否以“mr_”开头,不区分字母大小写,代码如下:
    1. # -*- coding: utf-8 -*-# @Time    : 2024-09-25 9:50# @Author  : AmoXiang# @File: re_demo.py# @Software: PyCharm# @Blog: https://blog.csdn.net/xw1680import re
    2.   # 导入正则表达式re模块pattern = r'mr_\w+'  # 模式字符串string = 'MR_SHOP mr_shop'  # 要匹配的字符串match = re.match(pattern, string, re.I)  # 匹配字符串,不区分大小写print(match)  # 打印匹配效果 <re.Match object; span=(0, 7), match='MR_SHOP'>string = '项目名称MR_SHOP mr_shop'match = re.match(pattern, string, re.I)  # 匹配字符串,不区分大小写print(match)  # 打印匹配效果 None
    复制代码
    3.7 search()方法——搜刮第一个匹配位置

    search() 方法用于在整个字符串中搜刮第一个匹配的值,假如匹配乐成,则返回 Match 对象,否则返回 None。语法格式如下:
    1. In [13]: re.search?
    2. Signature: re.search(pattern, string, flags=0)
    3. Docstring:
    4. Scan through string looking for a match to the pattern, returning
    5. a Match object, or None if no match was found.
    6. File:      f:\dev_tools\python\python310\lib\re.py
    7. Type:      function
    8. 参数说明:
    9. 1.pattern: 表示模式字符串,由要匹配的正则表达式转换而来。
    10. 2.string: 表示要匹配的字符串。
    11. 3.flags: 可选参数,表示标志位,用于控制匹配方式,如是否区分字母大小写。
    12. 4.返回值: 扫描整个字符串找到匹配样式的第一个位置,并返回一个相应的匹配对象。如果没有匹配,就返回一个 None。
    13. 注意,这和找到一个零长度匹配是不同的。
    复制代码
    示例:搜刮第一个以“mr_”开头的字符串,使用search()方法搜刮第一个以“mr_”开头的字符串,不区分字母大小写,代码如下:
    1. # -*- coding: utf-8 -*-# @Time    : 2024-09-25 9:50# @Author  : AmoXiang# @File: re_demo.py# @Software: PyCharm# @Blog: https://blog.csdn.net/xw1680import re
    2.   # 导入正则表达式re模块pattern = r'mr_\w+'  # 模式字符串string = 'MR_SHOP mr_shop'  # 要匹配的字符串match = re.search(pattern, string, re.I)  # 搜刮字符串,不区分大小写print(match)  # 打印匹配效果 <re.Match object; span=(0, 7), match='MR_SHOP'>string = '项目名称MR_SHOP mr_shop'match = re.search(pattern, string, re.I)  # 搜刮字符串,不区分大小写print(match)  # 打印匹配效果 <re.Match object; span=(4, 11), match='MR_SHOP'>
    复制代码
    3.8 split()方法——根据正则表达式分割字符串

    split() 方法用于实现根据正则表达式分割字符串,并以列表的形式返回。其作用同字符串对象的 split() 方法类似,所差别的就是分割字符由模式字符串指定。语法格式如下:
    1. In [14]: re.split?
    2. Signature: re.split(pattern, string, maxsplit=0, flags=0)
    3. Docstring:
    4. Split the source string by the occurrences of the pattern,
    5. returning a list containing the resulting substrings.  If
    6. capturing parentheses are used in pattern, then the text of all
    7. groups in the pattern are also returned as part of the resulting
    8. list.  If maxsplit is nonzero, at most maxsplit splits occur,
    9. and the remainder of the string is returned as the final element
    10. of the list.
    11. File:      f:\dev_tools\python\python310\lib\re.py
    12. Type:      function
    13. 参数说明:
    14. 1.pattern: 表示模式字符串,由要匹配的正则表达式转换而来。
    15. 2.string: 表示要匹配的字符串。
    16. 3.maxsplit: 可选参数,表示最大的拆分次数。
    17. 4.flags: 可选参数,表示标志位,用于控制匹配方式,如是否区分字母大小写。
    18. 5.返回值: 返回一个分割后的字符串列表。
    复制代码
    示例:从给定的 URL 地点中提取出哀求地点和各个参数。使用split()方法实现从给定的URL地点中提取出哀求地点和各个参数的功能,代码如下:
    1. # -*- coding: utf-8 -*-# @Time    : 2024-09-25 9:50# @Author  : AmoXiang# @File: re_demo.py# @Software: PyCharm# @Blog: https://blog.csdn.net/xw1680import re
    2.   # 导入正则表达式re模块pattern = r'[?|&]'  # 定义分割符url = 'http://www.mingrisoft.com/login.jsp?username="mr"&pwd="mrsoft"'result = re.split(pattern, url)  # 分割字符串print(result)  # ['http://www.mingrisoft.com/login.jsp', 'username="mr"', 'pwd="mrsoft"']
    复制代码
    3.9 sub()方法——字符串更换

    sub() 方法用于实现字符串更换。语法格式如下:
    1. In [15]: re.sub?
    2. Signature: re.sub(pattern, repl, string, count=0, flags=0)
    3. Docstring:
    4. Return the string obtained by replacing the leftmost
    5. non-overlapping occurrences of the pattern in string by the
    6. replacement repl.  repl can be either a string or a callable;
    7. if a string, backslash escapes in it are processed.  If it is
    8. a callable, it's passed the Match object and must return
    9. a replacement string to be used.
    10. File:      f:\dev_tools\python\python310\lib\re.py
    11. Type:      function
    12. 参数说明:
    13. 1.pattern: 表示模式字符串,由要匹配的正则表达式转换而来。
    14. 2.repl: 表示替换的字符串。
    15. 3.string: 表示要被查找替换的原始字符串。
    16. 4.count: 可选参数,表示模式匹配后替换的最大次数,默认值为 0,表示替换所有的匹配。
    17. 5.flags: 可选参数,表示标志位,用于控制匹配方式,如是否区分字母大小写。
    18. 6.返回值: 返回替换后的字符串。
    复制代码
    示例1:隐藏中奖信息中的手机号码。使用sub()方法实现隐藏中奖信息中的手机号码的功能,代码如下:
    1. # -*- coding: utf-8 -*-# @Time    : 2024-09-25 9:50# @Author  : AmoXiang# @File: re_demo.py# @Software: PyCharm# @Blog: https://blog.csdn.net/xw1680import re
    2.   # 导入正则表达式re模块pattern = r'1[34578]\d{9}'  # 定义要更换的模式字符串string = '中奖号码为:84978981 接洽电话为:13611111111'result = re.sub(pattern, '1XXXXXXXXXX', string)  # 更换字符串print(result)  # 中奖号码为:84978981 接洽电话为:1XXXXXXXXXX
    复制代码
    示例2:扫除字符串中的汉字、字母与数字。使用sub()方法扫除字符串中的汉字、字母与数字,代码如下:
    1. # -*- coding: utf-8 -*-# @Time    : 2024-09-25 9:50# @Author  : AmoXiang# @File: re_demo.py# @Software: PyCharm# @Blog: https://blog.csdn.net/xw1680import re
    2. # 定义须要筛选的字符串string = 'abcdefghijklmnopqrstuvwxyz我爱Python0123456789!#$%&*+-.^_`|~'result = re.sub("[A-Za-z0-9\u4e00-\u9fa5]", "", string)  # 更换字符串print(result)  # 打印更换效果 !#$%&*+-.^_`|~
    复制代码
    3.10 subn()方法——字符串更换 (含更换次数)

    subn() 方法与 sub() 方法相同,都是用于实现字符串的更换。但 subn() 方法返回一个元组,此中包含新字符串和更换次数。语法格式如下:
    1. In [16]: re.subn?
    2. Signature: re.subn(pattern, repl, string, count=0, flags=0)
    3. Docstring:
    4. Return a 2-tuple containing (new_string, number).
    5. new_string is the string obtained by replacing the leftmost
    6. non-overlapping occurrences of the pattern in the source
    7. string by the replacement repl.  number is the number of
    8. substitutions that were made. repl can be either a string or a
    9. callable; if a string, backslash escapes in it are processed.
    10. If it is a callable, it's passed the Match object and must
    11. return a replacement string to be used.
    12. File:      f:\dev_tools\python\python310\lib\re.py
    13. Type:      function
    14. 参数说明:
    15. 1.pattern: 表示模式字符串,由要匹配的正则表达式转换而来。
    16. 2.repl: 表示替换的字符串。
    17. 3.string: 表示要被查找替换的原始字符串。
    18. 4.count: 可选参数,表示模式匹配后替换的最大次数,默认值为 0,表示替换所有的匹配。
    19. 5.flags: 可选参数,表示标志位,用于控制匹配方式,如是否区分字母大小写。
    20. 6.返回值: 返回一个包含替换后字符串与替换次数的元组。
    复制代码
    示例:更换字符串中的指定内容。使用subn()方法实现更换字符串中的指定内容的功能,代码如下:
    1. # -*- coding: utf-8 -*-# @Time    : 2024-09-25 9:50# @Author  : AmoXiang# @File: re_demo.py# @Software: PyCharm# @Blog: https://blog.csdn.net/xw1680import re
    2.   # 导入正则表达式re模块# ('AA3456abcdef', 2)print(re.subn('[1-2]', 'A', '123456abcdef'))  # 打印元组,包含新字符串与更换次数# I have A, I have B ,I have Cprint(re.sub('g.t', 'have', 'I get A, I got B ,I gut C'))  # 打印新字符串# ('I have A, I have B ,I have C', 3)print(re.subn('g.t', 'have', 'I get A, I got B ,I gut C'))  # 打印元组,包含新字符串与更换次数
    复制代码
    3.11 Pattern的属性以及方法

    3.11.1 Pattern.flags
    属性——获取正则匹配标志


    Pattern.flags
    属性用于获取正则表达式中匹配模式对应的标志。语法格式如下:
    1. Pattern.flags
    复制代码
    示例:获取常见匹配模式对应的标志。使用Pattern.flags
    属性获取常见匹配模式对应的标志,代码如下:

    1. # -*- coding: utf-8 -*-# @Time    : 2024-09-25 9:50# @Author  : AmoXiang# @File: re_demo.py# @Software: PyCharm# @Blog: https://blog.csdn.net/xw1680import re
    2.   # 导入正则表达式re模块pattern_I = re.compile('\w+', flags=re.I)  # 匹配模式,忽略大小写pattern_M = re.compile('\w+', flags=re.M)  # 匹配模式,多行pattern_S = re.compile('\w+', flags=re.S)  # 匹配模式,使用"."字符匹配全部字符,包括换行符pattern_X = re.compile('\w+', flags=re.X)  # 匹配模式,忽略模式字符串中未转义的空格和解释print('匹配模式I的标志为:', pattern_I.flags)print('匹配模式M的标志为:', pattern_M.flags)print('匹配模式S的标志为:', pattern_S.flags)print('匹配模式X的标志为:', pattern_X.flags)
    复制代码
    3.11.2 Pattern.groups
    属性——捕获组合的数目


    Pattern.groups
    属性用于获取正则表达式中组合的数目。语法格式如下:
    1. Pattern.groups
    复制代码
    示例: 获取正则表达式中组合的数目。使用Pattern.groups
    属性获取正则表达式中组合的数目,代码如下:

    1. # -*- coding: utf-8 -*-# @Time    : 2024-09-25 9:50# @Author  : AmoXiang# @File: re_demo.py# @Software: PyCharm# @Blog: https://blog.csdn.net/xw1680import re
    2.   # 导入正则表达式re模块pattern = re.compile('(\w+) (\w+)')  # 组合表达式print('组合数目为:', pattern.groups)
    复制代码
    3.11.3 Pattern.groupindex
    属性——获取分组名称与对应的分组编号


    Pattern.groupindex
    属性用于获取正则表达式中分组名称与对应的分组编号。语法格式如下:
    1. Pattern.groupindex
    复制代码
    示例:获取表达式中分组名称与对应的分组编号。使用Pattern.groupindex
    属性获取表达式中分组名称与对应的分组编号,代码如下:

    1. # -*- coding: utf-8 -*-# @Time    : 2024-09-25 9:50# @Author  : AmoXiang# @File: re_demo.py# @Software: PyCharm# @Blog: https://blog.csdn.net/xw1680import re
    2.   # 导入正则表达式re模块pattern = re.compile('(?P<group_1>\w+) (?P<group_2>\w+)')  # 分组表达式# 分组名称与对应的编号为: {'group_1': 1, 'group_2': 2}print('分组名称与对应的编号为:', pattern.groupindex)
    复制代码
    3.11.4 Pattern.pattern
    属性——获取模式字符串


    Pattern.pattern
    属性用于获取正则表达式中的模式字符串。语法格式如下:
    1. Pattern.pattern
    复制代码
    示例:获取表达式中的模式字符串。使用Pattern.pattern
    属性获取表达式中的模式字符串,代码如下:

    1. # -*- coding: utf-8 -*-# @Time    : 2024-09-25 9:50# @Author  : AmoXiang# @File: re_demo.py# @Software: PyCharm# @Blog: https://blog.csdn.net/xw1680import re
    2.   # 导入正则表达式re模块pattern = re.compile('(?P<group_1>\w+) (?P<group_2>\w+)')  # 分组表达式print(pattern.pattern)  # (?P<group_1>\w+) (?P<group_2>\w+)
    复制代码
    3.11.5 Pattern.f indall()方法——搜刮全部符合正则表达式的字符串

    Pattern.findall() 方法用于在整个字符串中搜刮全部符合正则表达式的字符串,并以列表的形式返回。假如匹配乐成,则返回包含匹配结构的列表,否则返回空列表。该方法可以指定匹配字符串的范围。语法格式如下:
    1. In [21]: pattern.findall?
    2. Signature: pattern.findall(string, pos=0, endpos=9223372036854775807)
    3. Docstring: Return a list of all non-overlapping matches of pattern in string.
    4. Type:      builtin_function_or_method
    5. 参数说明:
    6. 1.string: 表示需要匹配的字符串。
    7. 2.pos: 表示匹配的起始位置,该参数为可选参数,默认值为 0。
    8. 3.endpos: 表示匹配的结束位置,该参数为可选参数,默认为需要匹配字符串的长度,所以只有从 pos 到 endpos-1 的字符会被匹配。
    9. 4.返回值: 返回一个符合表达式匹配结果的列表。
    复制代码
    示例:搜刮字符串中以“mr_”开头的字符串。使用Pattern.findall()方法搜刮字符串中以“mr_”开头的字符串,代码如下:
    1. # -*- coding: utf-8 -*-# @Time    : 2024-09-25 9:50# @Author  : AmoXiang# @File: re_demo.py# @Software: PyCharm# @Blog: https://blog.csdn.net/xw1680import re
    2.   # 导入正则表达式re模块pattern = re.compile('mr_\w+')  # 正则表达式对象string = 'mr_SHOP mr_shop'  # 要匹配的字符串match = pattern.findall(string)  # 搜刮字符串print(match)  # 打印匹配效果 ['mr_SHOP', 'mr_shop']print(pattern.findall(string, 0, 5))  # 打印下标0~5的效果 ['mr_SH']
    复制代码
    3.11.6 Pattern.f inditer()方法——搜刮所匹配的全部子串

    Pattern.finditer() 方法用于在字符串中找到正则表达式所匹配的全部子串,把它们作为一个迭代器返回。该方法可以指定匹配字符串的范围。语法格式如下:
    1. In [28]: pattern.finditer?
    2. Signature: pattern.finditer(string, pos=0, endpos=9223372036854775807)
    3. Docstring:
    4. Return an iterator over all non-overlapping matches for the RE pattern in string.
    5. For each match, the iterator returns a match object.
    6. Type:      builtin_method
    7. 参数说明:
    8. 1.string: 表示需要匹配的字符串。
    9. 2.pos: 表示匹配的起始位置,该参数为可选参数,默认值为 0。
    10. 3.endpos: 表示匹配的结束位置,该参数为可选参数,默认为需要匹配字符串的长度,所以只有从 pos 到 endpos-1 的字符会被匹配。
    11. 4.返回值: 返回一个符合表达式匹配结果的迭代器。
    复制代码
    示例:获取字符串中指定范围的全部数字。使用Pattern.finditer()方法获取字符串中指定范围的全部数字,代码如下:
    1. # -*- coding: utf-8 -*-# @Time    : 2024-09-25 9:50# @Author  : AmoXiang# @File: re_demo.py# @Software: PyCharm# @Blog: https://blog.csdn.net/xw1680import re
    2.   # 导入正则表达式re模块pattern = re.compile('\d+')  # 正则表达式对象string = '12a32bc43jf3'  # 要匹配的字符串it = pattern.finditer(string, 2, 8)# 遍历获取后的迭代对象for match in it:    print(match.group())  # 打印数字
    复制代码
    3.11.7 Pattern.fullmatch()方法——对整个字符串匹配

    Pattern.fullmatch() 方法用于对整个字符串匹配。从 pos 下标位置开始逐个对字符串举行匹配直到 endpos 下标位置,假如匹配乐成则返回匹配乐成的 Match 对象;假如没有匹配乐成,就返回None。语法格式如下:
    1. In [27]: pattern.fullmatch?
    2. Signature: pattern.fullmatch(string, pos=0, endpos=9223372036854775807)
    3. Docstring: Matches against all of the string.
    4. Type:      builtin_method
    5. 参数说明:
    6. 1.string: 表示需要匹配的字符串。
    7. 2.pos: 表示匹配的起始位置,该参数为可选参数,默认值为 0。
    8. 3.endpos: 表示匹配的结束位置,该参数为可选参数,默认为需要匹配字符串的长度,所以只有从 pos 到 endpos-1 的字符会被匹配。
    9. 4.返回值: 如果整个 string 匹配到正则表达式样式,就返回一个相应的 Match 对象。
    复制代码
    示例:获取字符串中开始处符合表达式的值。使用Pattern.fullmatch()方法获取字符串中开始处符合表达式的值,代码如下:
    1. # -*- coding: utf-8 -*-# @Time    : 2024-09-25 9:50# @Author  : AmoXiang# @File: re_demo.py# @Software: PyCharm# @Blog: https://blog.csdn.net/xw1680import re
    2.   # 导入正则表达式re模块pattern = re.compile('[a-z]+')  # 定义匹配字母的表达式string = 'abcskd123jaw123'  # 须要匹配的字符串print(pattern.fullmatch(string, 0, 5))  # 打印匹配效果,匹配范围0~5
    复制代码
    3.11.8 Pattern.match()方法——从字符开始处匹配字符串的值

    Pattern.match() 方法用于从字符开始处匹配字符串的值,从 pos 下标位置开始逐个对字符串举行匹配直到 endpos 下标位置,假如匹配乐成则返回匹配乐成的 Match 对象;假如没有匹配乐成,就返回 None。语法格式如下:
    1. In [26]: pattern.match?
    2. Signature: pattern.match(string, pos=0, endpos=9223372036854775807)
    3. Docstring: Matches zero or more characters at the beginning of the string.
    4. Type:      builtin_method
    5. 参数说明:
    6. 1.string: 表示需要匹配的字符串。
    7. 2.pos: 表示匹配的起始位置,该参数为可选参数,默认值为 0。
    8. 3.endpos: 表示匹配的结束位置,该参数为可选参数,默认为需要匹配字符串的长度,所以只有从 pos 到 endpos-1 的字符会被匹配。
    9. 4.返回值: 如果 string 开始的位置可以匹配到正则表达式样式,就返回一个相应的 Match 对象。
    复制代码
    示例:获取字符串中开始处符合表达式的值。使用Pattern.match()方法获取字符串中开始处符合表达式的值,代码如下:
    1. # -*- coding: utf-8 -*-# @Time    : 2024-09-25 9:50# @Author  : AmoXiang# @File: re_demo.py# @Software: PyCharm# @Blog: https://blog.csdn.net/xw1680import re
    2.   # 导入正则表达式re模块pattern = re.compile('[a-z]+')  # 定义匹配字母的表达式string = '12312abc1234546lskdj'  # 须要匹配的字符串# <re.Match object; span=(5, 8), match='abc'>print(pattern.match(string, 5, 10))  # 打印匹配效果,匹配范围5~10
    复制代码
    3.11.9 Pattern.search()方法——搜刮第一个匹配的位置

    Pattern.search() 方法用于搜刮第一个匹配的位置,从 pos 下标位置开始逐个对字符串举行匹配直到 endpos 下标位置,假如匹配乐成,则返回匹配乐成的 Match 对象,否则返回 None。语法格式如下:
    1. In [25]: pattern.search?
    2. Signature: pattern.search(string, pos=0, endpos=9223372036854775807)
    3. Docstring:
    4. Scan through string looking for a match, and return a corresponding match object instance.
    5. Return None if no position in the string matches.
    6. Type:      builtin_method
    7. 参数说明:
    8. 1.string: 表示需要匹配的字符串。
    9. 2.pos: 表示匹配的起始位置,该参数为可选参数,默认值为 0。
    10. 3.endpos: 表示匹配的结束位置,该参数为可选参数,默认为需要匹配字符串的长度,所以只有从 pos 到 endpos-1 的字符会被匹配。
    11. 4.返回值: 扫描整个字符串找到匹配样式的第一个位置,并返回一个相应的匹配对象。
    复制代码
    示例:获取字符串中第一个匹配值与位置。使用Pattern.search()方法获取字符串中第一个匹配值与位置,代码如下:
    1. # -*- coding: utf-8 -*-# @Time    : 2024-09-25 9:50# @Author  : AmoXiang# @File: re_demo.py# @Software: PyCharm# @Blog: https://blog.csdn.net/xw1680import re
    2.   # 导入正则表达式re模块pattern = re.compile('[0-9]+')  # 定义匹配数字的表达式string = '12312abc1234546lskdj'  # 须要匹配的字符串print(pattern.search(string, 0, 10))  # 打印匹配效果,匹配范围0~10
    复制代码
    3.11.10 Pattern.split()方法——同split()方法

    Pattern.split() 方法与 re.split() 方法相同,用于实现根据正则表达式分割字符串,并以列表的形式返回。其作用同字符串对象的 split() 方法类似,所差别的是分割字符由模式字符串指定。语法格式如下:
    1. In [24]: pattern.split?
    2. Signature: pattern.split(string, maxsplit=0)
    3. Docstring: Split string by the occurrences of pattern.
    4. Type:      builtin_function_or_method
    5. 参数说明:
    6. 1.string: 表示需要匹配的字符串。
    7. 2.maxsplit: 可选参数,表示最大的拆分次数。
    8. 3.返回值: 返回一个分割后的字符串列表。
    复制代码
    示例:从给定的 URL 地点中提取出哀求地点和各个参数。使用Pattern.split()方法实现从给定的URL地点中提取出哀求地点和各个参数,代码如下:
    1. # -*- coding: utf-8 -*-# @Time    : 2024-09-25 9:50# @Author  : AmoXiang# @File: re_demo.py# @Software: PyCharm# @Blog: https://blog.csdn.net/xw1680import re
    2.   # 导入正则表达式re模块pattern = re.compile('[?|&]')  # 定义分割符url = 'http://www.mingrisoft.com/login.jsp?username="mr"&pwd="mrsoft"'# ['http://www.mingrisoft.com/login.jsp', 'username="mr"', 'pwd="mrsoft"']result = pattern.split(url)  # 分割字符串print(result)
    复制代码
    3.11.11 Pattern.sub()方法——字符串更换

    Pattern.sub() 方法与 re.sub() 方法相同,用于实现字符串更换。语法格式如下:
    1. In [23]: pattern.sub?
    2. Signature: pattern.sub(repl, string, count=0)
    3. Docstring: Return the string obtained by replacing the leftmost non-overlapping
    4. occurrences of pattern in string by the replacement repl.
    5. Type:      builtin_method
    6. 参数说明:
    7. 1.repl: 表示替换的字符串。
    8. 2.string: 表示要被查找替换的原始字符串。
    9. 3.count: 可选参数,表示模式匹配后替换的最大次数,默认值为 0,表示替换所有的匹配。
    10. 4.返回值: 返回替换后的字符串。
    复制代码
    示例:隐藏中奖信息中的手机号码。使用Pattern.sub()方法实现隐藏中奖信息中的手机号码的功能,代码如下:
    1. # -*- coding: utf-8 -*-# @Time    : 2024-09-25 9:50# @Author  : AmoXiang# @File: re_demo.py# @Software: PyCharm# @Blog: https://blog.csdn.net/xw1680import re
    2.   # 导入正则表达式re模块pattern = re.compile('1[34578]\d{9}')  # 定义要更换的模式字符串string = '中奖号码为:84978981 接洽电话为:13611111111'result = pattern.sub('1XXXXXXXXXX', string)  # 更换字符串print(result)  # 中奖号码为:84978981 接洽电话为:1XXXXXXXXXX
    复制代码
    3.11.12 Pattern.subn()方法——字符串更换(含更换次数)

    Pattern.subn() 方法与 re.subn() 方法相同,都是用于实现字符串的更换并返回一个元组,此中包含新字符串和更换次数。语法格式如下:
    1. In [22]: pattern.subn?
    2. Signature: pattern.subn(repl, string, count=0)
    3. Docstring: Return the tuple (new_string, number_of_subs_made) found by replacing the leftmost
    4. non-overlapping occurrences of pattern with the replacement repl.
    5. Type:      builtin_method
    6. 参数说明:
    7. 1.repl: 表示替换的字符串。
    8. 2.string: 表示要被查找替换的原始字符串。
    9. 3.count: 可选参数,表示模式匹配后替换的最大次数,默认值为 0,表示替换所有的匹配。
    10. 4.返回值: 返回一个包含替换后字符串与替换次数的元组。
    复制代码
    示例:更换字符串中的指定内容。使用Pattern.subn()方法实现更换字符串中的指定内容的功能,代码如下:
    1. # -*- coding: utf-8 -*-# @Time    : 2024-09-25 9:50# @Author  : AmoXiang# @File: re_demo.py# @Software: PyCharm# @Blog: https://blog.csdn.net/xw1680import re
    2.   # 导入正则表达式re模块pattern = re.compile('[1-2]')  # 数值更换表达式,更换字符串中的1-2pattern2 = re.compile('g.t')  # 字幕更换表达式,更换字符串中的get、got、gut# 须要匹配的字符串string = '123456abcdef'string2 = 'I get A, I got B ,I gut C'print(pattern.subn('A', string))  # 打印元组,包含新字符串与更换次数 ('AA3456abcdef', 2)print(pattern2.sub('have', string2))  # 打印新字符串 I have A, I have B ,I have Cprint(pattern2.subn('have', string2))  # 打印元组,包含新字符串与更换次数 ('I have A, I have B ,I have C', 3)
    复制代码
    3.12 Match对象属性及方法

    3.12.1 Match.endpos
    属性——竣事匹配的索引位置


    Match.endpos
    属性用于获取正则表达式在字符串竣事匹配的索引位置。语法格式如下:
    1. Match.endpos
    复制代码
    示例:获取正则表达式在字符串竣事匹配的索引位置。使用Match.endpos
    属性获取正则表达式在字符串竣事匹配的索引位置,代码如下:

    1. # -*- coding: utf-8 -*-# @Time    : 2024-09-25 9:50# @Author  : AmoXiang# @File: re_demo.py# @Software: PyCharm# @Blog: https://blog.csdn.net/xw1680import re
    2.   # 导入正则表达式re模块pattern = re.compile('mr_\w+')  # 分组表达式string = 'MR_SHOP mr_shop'  # 要匹配的字符串match = re.search(pattern, string)  # 匹配效果Match对象print(match)  # 打印匹配的Match对象 <re.Match object; span=(8, 15), match='mr_shop'>print(match.endpos)  # 打印匹配的竣事位置 15
    复制代码
    3.12.2 Match.pos
    属性——开始匹配的索引位置


    Match.pos
    属性用于获取正则表达式在字符串开始匹配的索引位置。语法格式如下:
    1. Match.pos
    复制代码
    示例:获取正则表达式在字符串开始匹配的索引位置。使用Match.pos
    属性获取正则表达式在字符串开始匹配的索引位置,代码如下:

    1. # -*- coding: utf-8 -*-# @Time    : 2024-09-25 9:50# @Author  : AmoXiang# @File: re_demo.py# @Software: PyCharm# @Blog: https://blog.csdn.net/xw1680import re
    2.   # 导入正则表达式re模块pattern = re.compile('mr_\w+')  # 分组表达式string = 'MR_SHOP mr_shop'  # 要匹配的字符串match = re.search(pattern, string)  # 匹配效果Match对象print(match)  # 打印匹配的Match对象print(match.pos)  # 打印匹配的起始位置
    复制代码
    3.12.3 Match.lastindex
    属性——捕获组的最后一个匹配的索引值


    Match.lastindex
    属性用于捕获组的最后一个匹配的索引值。语法格式如下:
    1. Match.lastindex
    复制代码
    示例:获取最后一个匹配到的组所对应的索引值。使用Match.lastindex
    属性获取最后一个匹配到的组所对应的索引值,代码如下:

    1. # -*- coding: utf-8 -*-# @Time    : 2024-09-25 9:50# @Author  : AmoXiang# @File: re_demo.py# @Software: PyCharm# @Blog: https://blog.csdn.net/xw1680import re
    2.   # 导入正则表达式re模块pattern = re.compile('(?P<group_1>\w+) (?P<group_2>\w+)', re.I)  # 分组表达式string = 'MR_SHOP mr_shop'  # 要匹配的字符串match = re.match(pattern, string)  # 匹配效果Match对象print(match.lastindex)  # 打印最后一个匹配到的组所对应的索引值 2
    复制代码
    3.12.4 Match.lastgroup属性——获取最后一个匹配组的名称

    Match.lastgroup 属性用于获取最后一个匹配组的名称,假如匹配的组没著名字或者没有产生匹配的情况下,则返回 None。语法格式如下:
    1. In [44]: match.lastgroup?
    2. Type:        NoneType
    3. String form: None
    4. Docstring:   <no docstring>
    复制代码
    示例:获取最后一个匹配组的名称。使用Match.lastgroup属性获取最后一个匹配组的名称,代码如下:
    1. # -*- coding: utf-8 -*-# @Time    : 2024-09-25 9:50# @Author  : AmoXiang# @File: re_demo.py# @Software: PyCharm# @Blog: https://blog.csdn.net/xw1680import re
    2.   # 导入正则表达式re模块pattern = re.compile('(?P<group_1>\w+) (?P<group_2>\w+)', re.I)  # 分组表达式string = 'MR_SHOP mr_shop'  # 要匹配的字符串match = re.match(pattern, string)  # 匹配效果Match对象print(match.lastgroup)  # 打印最后一个匹配组的名称
    复制代码
    3.12.5 Match.re属性——返回正则表达式对象

    Match.re 属性用于获取产生 Match 实例的正则表达式对象。语法格式如下:
    1. In [43]: match.re?
    2. Type:        Pattern
    3. String form: re.compile('\\d')
    4. File:        f:\dev_tools\python\python310\lib\re.py
    5. Docstring:   Compiled regular expression object.
    复制代码
    示例:获取产生Match实例的正则表达式对象。使用Match.re属性获取产生Match实例的正则表达式对象,代码如下:
    1. # -*- coding: utf-8 -*-# @Time    : 2024-09-25 9:50# @Author  : AmoXiang# @File: re_demo.py# @Software: PyCharm# @Blog: https://blog.csdn.net/xw1680import re
    2.   # 导入正则表达式re模块pattern = re.compile('(?P<group_1>\w+) (?P<group_2>\w+)', re.I)  # 分组表达式string = 'MR_SHOP mr_shop'  # 要匹配的字符串match = re.match(pattern, string)  # 匹配效果Match对象print(match.re)  # 打印获取的表达式对象
    复制代码
    3.12.6 Match.string属性——获取须要匹配的字符串

    Match.string 属性用于获取 Match 对象中须要匹配的字符串。语法格式如下:
    1. In [42]: match.string?
    2. Type:        str
    3. String form: 123456
    4. Length:      6
    5. Docstring:
    6. str(object='') -> str
    7. str(bytes_or_buffer[, encoding[, errors]]) -> str
    8. Create a new string object from the given object. If encoding or
    9. errors is specified, then the object must expose a data buffer
    10. that will be decoded using the given encoding and error handler.
    11. Otherwise, returns the result of object.__str__() (if defined)
    12. or repr(object).
    13. encoding defaults to sys.getdefaultencoding().
    14. errors defaults to 'strict'.
    复制代码
    示例:获取Match对象中须要匹配的字符串。使用Match.string属性获取Match对象中须要匹配的字符串,代码如下:
    1. # -*- coding: utf-8 -*-# @Time    : 2024-09-25 9:50# @Author  : AmoXiang# @File: re_demo.py# @Software: PyCharm# @Blog: https://blog.csdn.net/xw1680import re
    2.   # 导入正则表达式re模块pattern = re.compile('(?P<group_1>\w+) (?P<group_2>\w+)', re.I)  # 分组表达式string = 'MR_SHOP mr_shop'  # 要匹配的字符串match = re.match(pattern, string)  # 匹配效果Match对象print(match.string)  # 打印Match对象中须要匹配的字符串 MR_SHOP mr_shop
    复制代码
    3.12.7 Match.__getitem__() 方法——返回一个匹配的分组信息

    Match.__getitem__() 方法与 Match.group() 方法相似,只是 __getitem__() 方法每次只能获取一个分组的信息。语法格式如下:
    1. In [41]: match.__getitem__?
    2. Signature:      match.__getitem__(key, /)
    3. Call signature: match.__getitem__(*args, **kwargs)
    4. Type:           method-wrapper
    5. String form:    <method-wrapper '__getitem__' of re.Match object at 0x000001BEA4520240>
    6. Docstring:      Return self[key].
    7. 参数说明:
    8. 1.g: 表示分组对应的编号或分组名称。
    9. 2.返回值: 返回一个匹配的分组信息。
    复制代码
    示例:获取指定分组对应的信息。使用Match.__getitem__()方法获取指定分组对应的信息,代码如下:
    1. # -*- coding: utf-8 -*-# @Time    : 2024-09-25 9:50# @Author  : AmoXiang# @File: re_demo.py# @Software: PyCharm# @Blog: https://blog.csdn.net/xw1680import re
    2.   # 导入正则表达式re模块pattern = re.compile('(?P<group_1>\w+) (?P<group_2>\w+)', re.I)  # 分组表达式string = 'MR_SHOP mr_shop'  # 要匹配的字符串match = re.match(pattern, string)  # 匹配效果Match对象print(match.__getitem__(1))  # 打印指定分组编号对应内容 MR_SHOPprint(match.__getitem__('group_2'))  # 打印指定分组名对应内容mr_shop
    复制代码
    3.12.8 Match.end()方法——返回分组匹配字符串对应的竣事标志

    Match.end() 方法用于获取分组匹配字符串对应的竣事标志。语法格式如下:
    1. In [40]: match.end?
    2. Signature: match.end(group=0, /)
    3. Docstring: Return index of the end of the substring matched by group.
    4. Type:      builtin_function_or_method
    5. 参数说明:
    6. 1.group: 表示分组名或者分组名对应的编号。
    7. 2.返回值: 返回分组匹配字符串对应的结束标记。
    复制代码
    示例:获取分组匹配字符串对应的开始、竣事标志。使用Match.start()方法与Match.end()方法获取分组匹配字符串对应的开始、竣事标志,代码如下:
    1. # -*- coding: utf-8 -*-# @Time    : 2024-09-25 9:50# @Author  : AmoXiang# @File: re_demo.py# @Software: PyCharm# @Blog: https://blog.csdn.net/xw1680import re
    2.   # 导入正则表达式re模块pattern = re.compile('(?P<group_1>\w+) (?P<group_2>\w+)', re.I)  # 分组表达式string = 'MR_SHOP mr_shop'  # 要匹配的字符串match = re.match(pattern, string)  # 匹配效果Match对象print(match.start(), match.end())  # 打印全部分组的匹配字符串对应的开始、竣事标志 0 15print(match.start(1), match.end(1))  # 打印编号1分组的匹配字符串对应的开始、竣事标志 0 7print(match.start(2), match.end(2))  # 打印编号2分组的匹配字符串对应的开始、竣事标志 8 15# 打印分组名的匹配字符串对应的开始、竣事标志print(match.start('group_1'), match.end('group_2'))  # 0 15
    复制代码
    3.12.9 Match.expand()方法——对“\”举行转义更换并返回

    Match.expand() 方法用于实现把字符串中用反斜杠 "\" 表示的数字或组名更换为相应分组中的值的功能。语法格式如下:
    1. In [39]: match.expand?
    2. Signature: match.expand(template)
    3. Docstring: Return the string obtained by doing backslash substitution on the string template,
    4. as done by the sub() method.
    5. Type:      builtin_function_or_method
    6. 参数说明:
    7. 1.template: 表示需要替换的字符串。
    8. 2.返回值: 返回对""进行转义替换的结果。
    复制代码
    示例:在字符串中指定位置更换对应分组中的值。使用Match.expand()方法,在字符串中指定位置更换对应分组中的值,代码如下:
    1. # -*- coding: utf-8 -*-# @Time    : 2024-09-25 9:50# @Author  : AmoXiang# @File: re_demo.py# @Software: PyCharm# @Blog: https://blog.csdn.net/xw1680import re
    2.   # 导入正则表达式re模块pattern = re.compile('(?P<group_1>\w+) (?P<group_2>\w+)', re.I)  # 分组表达式string = 'MR_SHOP mr_shop'  # 要匹配的字符串match = re.match(pattern, string)  # 匹配效果Match对象print(match[1])  # 打印分组1内容 MR_SHOPprint(match[2])  # 打印分组2内容 mr_shop# 第一种更换方式,\1、\2更换分组1和2的内容print(match.expand(r'first_ \1 \2'))  # first_ MR_SHOP mr_shop# 第二种更换方式,\g<1>、\g<2>更换分组1和2的内容print(match.expand('second_ \g<1> \g<2>'))  # second_ MR_SHOP mr_shop# 第三种更换方式,\g<group_1>、\g<group_2>更换分组1和2的内容print(match.expand('third_ \g<group_1> \g<group_2>'))  # third_ MR_SHOP mr_shop
    复制代码
    3.12.10 Match.groups()方法——以元组形式返回全部子组中内容

    Match.groups() 方法用于获取以元组形式返回全部子组中内容。语法格式如下:
    1. In [38]: match.groups?
    2. Signature: match.groups(default=None)
    3. Docstring:
    4. Return a tuple containing all the subgroups of the match, from 1.
    5. default
    6.   Is used for groups that did not participate in the match.
    7. Type:      builtin_function_or_method
    8. 参数说明:
    9. 1.default: 用于不参与匹配的情况,默认为 None。
    10. 2.返回值: 以元组形式返回所有子组中内容。
    复制代码
    示例:获取全部分组对应的内容。使用Match.groups()方法获取全部分组对应的内容,代码如下:
    1. # -*- coding: utf-8 -*-# @Time    : 2024-09-25 9:50# @Author  : AmoXiang# @File: re_demo.py# @Software: PyCharm# @Blog: https://blog.csdn.net/xw1680import re
    2.   # 导入正则表达式re模块pattern = re.compile('(?P<group_1>\w+) (?P<group_2>\w+)', re.I)  # 分组表达式string = 'MR_SHOP mr_shop'  # 要匹配的字符串match = re.match(pattern, string)  # 匹配效果Match对象print(match.groups())  # 打印全部分组对应的内容 ('MR_SHOP', 'mr_shop')
    复制代码
    3.12.11 Match.group()方法——返回一个或者多个匹配的子组

    Match.group() 方法用于获取 Match 对象中一个或多个匹配的子组。假如只有一个(0~99)参数,效果就是一个字符串;假如有多个参数,效果就是一个元组(每个参数对应一个项);假如没有参数,组 1 默认到 0(整个匹配都被返回)。假如一个组 N 参数值为 0,相应的返回值就是整个匹配字符串;假如一个组号是负数或超出组的最大长度,则给出越界错误;假如正则表达式中的一个组匹配了多个值,则相应的组只生存最后匹配的值。语法格式如下:
    1. In [37]: match.group?
    2. Docstring:
    3. group([group1, ...]) -> str or tuple.
    4. Return subgroup(s) of the match by indices or names.
    5. For 0 returns the entire match.
    6. Type:      builtin_function_or_method
    7. 参数说明:
    8. 1.group1: 表示分组对应的编号或分组名称。
    9. 2.返回值: 返回一个或者多个匹配的子组。
    复制代码
    示例:获取指定分组对应的信息。使用Match.group()方法获取指定分组对应的信息,代码如下:
    1. # -*- coding: utf-8 -*-# @Time    : 2024-09-25 9:50# @Author  : AmoXiang# @File: re_demo.py# @Software: PyCharm# @Blog: https://blog.csdn.net/xw1680import re
    2.   # 导入正则表达式re模块pattern = re.compile('(?P<group_1>\w+) (?P<group_2>\w+)', re.I)  # 分组表达式string = 'MR_SHOP mr_shop'  # 要匹配的字符串match = re.match(pattern, string)  # 匹配效果Match对象print(match.group())  # 无参数打印全部内容 MR_SHOP mr_shopprint(match.group(1))  # 打印指定分组编号对应内容 MR_SHOPprint(match.group('group_2'))  # 打印指定分组名对应内容 mr_shop
    复制代码
    3.12.12 Match.groupdict()方法——返回包含全部匹配值分组的字典

    Match.groupdict() 方法用于获取以字典形式返回包含全部匹配值分组的信息,此中 key 就是组名,value 就是分组匹配的信息内容。语法格式如下:
    1. In [36]: match.groupdict?
    2. Signature: match.groupdict(default=None)
    3. Docstring:
    4. Return a dictionary containing all the named subgroups of the match, keyed by the subgroup name.
    5. default
    6.   Is used for groups that did not participate in the match.
    7. Type:      builtin_function_or_method
    8. 参数说明:
    9. 1.default: 用于不参与匹配的情况,默认为 None。
    10. 2.返回值: 以字典形式返回包含所有匹配值分组的信息。
    复制代码
    示例:获取字典形式的分组信息。使用Match.groupdict()方法获取字典形式的分组信息,代码如下:
    1. # -*- coding: utf-8 -*-# @Time    : 2024-09-25 9:50# @Author  : AmoXiang# @File: re_demo.py# @Software: PyCharm# @Blog: https://blog.csdn.net/xw1680import re
    2.   # 导入正则表达式re模块pattern = re.compile('(?P<group_1>\w+) (?P<group_2>\w+)', re.I)  # 分组表达式string = 'MR_SHOP mr_shop'  # 要匹配的字符串match = re.match(pattern, string)  # 匹配效果Match对象# {'group_1': 'MR_SHOP', 'group_2': 'mr_shop'}print(match.groupdict())  # 打印字典形式的分组信息
    复制代码
    3.12.13 Match.span()方法——返回包含开始和竣事位置的二元组

    Match.span() 方法用于获取指定分组匹配字符串的开始和竣事位置。语法格式如下:
    1. In [35]: match.span?
    2. Signature: match.span(group=0, /)
    3. Docstring: For match object m, return the 2-tuple (m.start(group), m.end(group)).
    4. Type:      builtin_function_or_method
    5. 参数说明:
    6. 1.group: 表示分组名或者分组名对应的编号。
    7. 2.返回值: 返回一个包含开始和结束位置的二元组。
    复制代码
    示例:获取指定分组匹配字符串的开始和竣事位置。使用Match.span()方法获取指定分组匹配字符串的开始和竣事位置,代码如下:
    1. # -*- coding: utf-8 -*-# @Time    : 2024-09-25 9:50# @Author  : AmoXiang# @File: re_demo.py# @Software: PyCharm# @Blog: https://blog.csdn.net/xw1680import re
    2.   # 导入正则表达式re模块pattern = re.compile('(?P<group_1>\w+) (?P<group_2>\w+)', re.I)  # 分组表达式string = 'MR_SHOP mr_shop'  # 要匹配的字符串match = re.match(pattern, string)  # 匹配效果Match对象print(match.span(1))  # 打印分组编号1匹配字符串对应的开始、竣事标志 (0, 7)print(match.span('group_2'))  # 打印分组名group_2匹配字符串对应的开始、竣事标志 (8, 15)
    复制代码
    3.12.14 Match.start()方法——返回分组匹配字符串对应的开始标志

    Match.start() 方法用于获取分组匹配字符串对应的开始标志。语法格式如下:
    1. In [34]: match.start?
    2. Signature: match.start(group=0, /)
    3. Docstring: Return index of the start of the substring matched by group.
    4. Type:      builtin_function_or_method
    5. 参数说明:
    6. 1.group: 表示分组名或者分组名对应的编号。
    7. 2.返回值: 返回分组匹配字符串对应的开始标记。
    复制代码
    示例1:获取分组匹配字符串对应的开始、竣事标志。使用Match.start()方法与Match.end()方法获取分组匹配字符串对应的开始、竣事标志,代码如下:
    1. # -*- coding: utf-8 -*-# @Time    : 2024-09-25 9:50# @Author  : AmoXiang# @File: re_demo.py# @Software: PyCharm# @Blog: https://blog.csdn.net/xw1680import re
    2.   # 导入正则表达式re模块pattern = re.compile('(?P<group_1>\w+) (?P<group_2>\w+)', re.I)  # 分组表达式string = 'MR_SHOP mr_shop'  # 要匹配的字符串match = re.match(pattern, string)  # 匹配效果Match对象print(match.start(), match.end())  # 打印全部分组的匹配字符串对应的开始、竣事标志 0 15print(match.start(1), match.end(1))  # 打印编号1分组的匹配字符串对应的开始、竣事标志 0 7print(match.start(2), match.end(2))  # 打印编号2分组的匹配字符串对应的开始、竣事标志 8 15# 打印分组名的匹配字符串对应的开始、竣事标志print(match.start('group_1'), match.end('group_2'))  # 0 15
    复制代码
    示例2:移除表达式搜刮的内容。通过Match.start()方法与Match.end()方法移除指定内容,代码如下:
    1. # -*- coding: utf-8 -*-# @Time    : 2024-09-25 9:50# @Author  : AmoXiang# @File: re_demo.py# @Software: PyCharm# @Blog: https://blog.csdn.net/xw1680import re
    2.   # 导入正则表达式re模块pattern = re.compile('(?P<group_1>\w+) (?P<group_2>\w+)', re.I)  # 分组表达式string = 'MR_SHOP mr_shop'  # 要匹配的字符串match = re.search('SHOP mr_', string)  # 匹配效果Match对象print(string)  # 打印原字符串 MR_SHOP mr_shopprint(match)  # 打印须要移除的内容 <re.Match object; span=(3, 11), match='SHOP mr_'>print(string[:match.start()] + string[match.end():])  # 打印移除后的内容 MR_shop
    复制代码
    免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
  • 本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?立即注册

    x
    回复

    使用道具 举报

    0 个回复

    正序浏览

    快速回复

    您需要登录后才可以回帖 登录 or 立即注册

    本版积分规则

    我可以不吃啊

    金牌会员
    这个人很懒什么都没写!

    标签云

    快速回复 返回顶部 返回列表