百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分类 > 正文

Python 正则表达式(四)

ztj100 2025-08-05 22:24 4 浏览 0 评论

前言

不知不觉,正则表达式已经来到了第四节啦!

今天要聊点什么呢?嗯...

对了,上节讲到的 匹配对象 ,好像提到过好几次,但是都没讲它是啥。

抓紧时间,废话少说,今天就聊聊它吧。

匹配对象

介绍

匹配对象,顾名思义就是匹配成功所返回的存储了匹配信息的对象

如果没有匹配的话会返回 None 。

所以你可以简单的用 if 语句来判断是否匹配。

像 match() 和 search() 匹配成功都会返回一个 匹配对象

match = re.search(pattern, string)
if match:
    process(match)

常用方法和属性

1、group

介绍

Match.group([group1, ...])

返回一个或者多个匹配的子组。

  • 如果只有一个参数,结果就是一个字符串
  • 如果有多个参数,结果就是一个元组(每个参数对应一个项)
  • 如果没有参数,group1 参数默认等于 0(即返回整个匹配)
  • 如果一个组号是负数,或者大于样式中定义的组数,抛出一个 IndexError 索引错误。
  • 如果分组被命名, 那么 groupN 参数就可以是命名组合的名字
  • 如果一个组匹配了多次,就只返回最后一个匹配

示例

m = re.match(r"(\w+) (\w+)", "Lebron James, Kobe")

m.group()
# out: 'Lebron James'
m.group(0)
# out: 'Lebron James'
m.group(1)
# out: 'Lebron'
m.group(2)
# out: 'James'
m.group(1, 2)
# out: ('Lebron', 'James')
m.group(3)
# out: 'IndexError: no such group'

# 命名分组
m = re.match(r"(?P<first_name>\w+) (?P<last_name>\w+)", "Lebron James")
m.group('first_name')  # ==> m.group(1)
# out: 'Lebron',依旧可以使用数字索引
m.group('last_name')   # ==> m.group(2)
# out: 'James'

# 多次匹配,返回最后一个匹配
m = re.match(r"(..)+", "aabbcc")
m.group(1)
# out: 'cc'

其实,上述 group(n) 可以直接通过 m[n] 获取

m = re.match(r"(?P<first_name>\w+) (?P<last_name>\w+)", "Lebron James")
m[0]
# out: 'Lebron James'
m[1]
# out: 'Lebron'
m[2]
# out: 'James'

2、groups

介绍

Match.groups(default=None)

返回一个包含所有匹配子组的元组,

default 参数设置匹配不成功时的返回值,默认为 None。

示例

m = re.match(r"(\d+)\.(\d+)", "3.1415926")
m.groups()
# out: ('3', '1415926')

# 设置未匹配的返回值
m = re.match(r"(\d+)\.?(\d+)?", "345")
m.groups()
# out: ('345', None)
m.groups(-1)
# out: ('345', -1)

3、groupdict

介绍

Match.groupdict(default=None)

返回一个字典,包含了所有的命名分组,key 就是组名。

default 参数同上。

如果分组未命名,则返回空字典

示例

m = re.match(r"(?P<first_name>\w+) (?P<last_name>\w+)", "Lebron James")
m.groupdict()
# out: {'first_name': 'Lebron', 'last_name': 'James'}

4、start 和 end

介绍

Match.start([group])

Match.end([group])

返回 group 匹配到的字串的开始和结束索引。

group 默认为 0(意思是整个匹配的子串)。

如果 group 存在,但未匹配到,就返回 -1 。

示例

m = re.match(r"(\w+) (\w+)", "Lebron James, Kobe")
m.start(), m.end()
# out: (0, 12)
m.start(1), m.end(1)
# out: (0, 6)
m.start(2), m.end(2)
# out: (7, 12)

string = "Lebron James, Kobe"
m.group(1) == string[m.start(1): m.end(1)]
# out: True

5、span

介绍

Match.span([group])

对于一个匹配 m ,返回一个二元组 (m.start(group), m.end(group)) 。

注意:如果 group 没有在这个匹配中,就返回 (-1, -1) 。

group 默认为 0,就是整个匹配。

示例

m = re.match(r"(\w+) (\w+)", "Lebron James, Kobe")
m.span()
# out: (0, 12)

6、属性

Match.re: 返回产生这个实例的正则表达式对象

Match.string: 传递到 match() 或 search() 的字符串

m = re.match(r"(\w+) (\w+)", "Lebron James, Kobe")
m.string
# out: 'Lebron James, Kobe'
m.re
# out: re.compile(r'(\w+) (\w+)', re.UNICODE)

讲到这,我们就把下面要说的内容引出来了。

是的,没错,正是正则表达式对象。

什么是正则表达式对象?

正则表达式对象

正则表达式字符串经过编译后,就是正则表达式对象了。

通过 compile 方法编译将正则表达式的样式编译为一个正则表达式对象

如果需要多次使用这个正则表达式的话,用 re.compile() 保存这个正则对象以便复用,可以让程序更加高效。

re.compile(pattern, flags=0)
# pattern: 传入的正则样式
# flags: 指定匹配模式,如 re.MULTILINE 等

prog = re.compile(pattern)
result = prog.match(string)

# 等价于
result = re.match(pattern, string)

正则表达式对象支持以下方法和属性

1、search

介绍

Pattern.search(string[, pos[, endpos]])

扫描整个 字符串 找到匹配样式的第一个位置,并返回一个相应的 匹配对象

如果没有匹配到,就返回 None

可选的第二个参数 pos 指定字符串中开始搜索的位置索引,默认为 0

可选参数 endpos 限定了字符串搜索的结束位置

p.search(string, pos, endpos) 等价于 p.search(string[pos:endpos], 0)

p = re.compile("dog")

m = p.search('a dog')
m.group()
# out: 'dog'

m = p.search('a dog', 3)
m # None

m = p.search('a dog', 2, 5)
m.group()
# out: 'dog'

2、match

介绍

Pattern.match(string[, pos[, endpos]])

如果从 string 的开始位置能够匹配到这个正则样式,就返回一个相应的匹配对象。

如果不匹配,就返回 None

可选参数 pos 和 endpos 与 search() 含义相同。

示例

p = re.compile("aaa")
m = p.match("hello aaa bbb")
m
# m is None
m = p.match("hello aaa bbb", 6)
m.group()
# out: 'aaa'

小结

其他正则对象的方法与 re 模块的方法大同小异。

只是加了 pos 和 endpos 两个参数来限制搜索范围

就不再重复讲啦!

总结

Python 正则表达式讲到这,已经差不多都讲完了。

学完这些,应该多找几个例子自己练练手,加深印象。

建议可以从网上随便下一个网站的源码,然后用 re 模块从源码中提取相应的信息

再建议,想不到什么网站的话,可以下载豆瓣电影排行榜网页源码,提取相应的电影信息

再再建议,前面的建议都动手做一下吧。

纸上得来终觉浅,绝知此事要躬行

相关推荐

作为后端开发,你知道MyBatis有哪些隐藏的 “宝藏” 扩展点吗?

在互联网大厂后端开发领域,MyBatis作为一款主流的持久层框架,凭借其灵活的配置与强大的数据处理能力,广泛应用于各类项目之中。然而,随着业务场景日趋复杂、系统规模不断扩张,开发过程中常面临SQL...

基于Spring+SpringMVC+Mybatis分布式敏捷开发系统架构(附源码)

前言zheng项目不仅仅是一个开发架构,而是努力打造一套从前端模板-基础框架-分布式架构-开源项目-持续集成-自动化部署-系统监测-无缝升级的全方位J2EE企业级开发解...

基于Java实现,支持在线发布API接口读取数据库,有哪些工具?

基于java实现,不需要编辑就能发布api接口的,有哪些工具、平台?还能一键发布、快速授权和开放提供给第三方请求调用接口的解决方案。架构方案设计:以下是一些基于Java实现的无需编辑或只需少量编辑...

Mybatis Plus框架学习指南-第三节内容

自动填充字段基本概念MyBatis-Plus提供了一个便捷的自动填充功能,用于在插入或更新数据时自动填充某些字段,如创建时间、更新时间等。原理...

被你误删了的代码,在 IntelliJ IDEA中怎么被恢复

在IntelliJIDEA中一不小心将你本地代码给覆盖了,这个时候,你ctrl+z无效的时候,是不是有点小激动?我今天在用插件mybatisgenerator自动生成mapper的时候,...

修改 mybatis-generator 中数据库类型和 Java 类型的映射关系

使用mybatis-generator发现数据库类型是tinyint(4),生成model时字段类型是Byte,使用的时候有点不便数据库的类型和Model中Java类型的关系...

又被问到了, java 面试题:反射的实现原理及用途?

一、反射的实现原理反射(Reflection)是Java在运行时动态获取类的元数据(如方法、字段、构造器等)并操作类对象的能力。其核心依赖于...

Spring Boot 中JPA和MyBatis技术那个更好?

你在进行SpringBoot项目开发时,是不是也经常在选择JPA和MyBatis这两个持久化技术上犯难?面对众多前辈的经验之谈,却始终拿不准哪种技术才最适合自己的项目?别担心,今天咱们就...

Spring Boot (七)MyBatis代码自动生成和辅助插件

一、简介1.1MyBatisGenerator介绍MyBatisGenerator是MyBatis官方出品的一款,用来自动生成MyBatis的mapper、dao、entity的框架,让...

解决MyBatis Generator自动生成.java.1文件

MyBatis框架操作数据库,一张表对应着一个实体类、一个Mapper接口文件、一个Mapper映射文件。一个工程项目通常最少也要几十张表,那工作量可想而知非常巨大的,MyBatis框架替我们想好了解...

Linux yq 命令使用详解

简介yq是一个轻量级、可移植的命令行...

7 段不到 50 行的 Python 脚本,解决 7 个真实麻烦:代码、场景与可复制

“...

Python学不会来打我(62) json数据操作汇总

很多小伙伴学了很久的python一直还是没有把数据类型之间的转换搞明白,上一篇文章我们详细分享了python的列表、元组、字典、集合之间的相互转换,这一篇文章我们来分享json数据相关的操作,虽然严格...

之前3W买的Python全系列教程完整版(懂中文就能学会)

今天给大家带来了干货,Python入门教程完整版,完整版啊!完整版!言归正传,小编该给大家介绍一下这套教程了,希望每个小伙伴都沉迷学习,无法自拔...

x-cmd pkg | grex - 正则表达式生成利器,解决手动编写的烦恼

简介grex是一个旨在简化创作正则表达式的复杂且繁琐任务的库和命令行程序。这个项目最初是DevonGovett编写的JavaScript工具regexgen的Rust移植。但re...

取消回复欢迎 发表评论: