本篇文章将深入探讨python的一项强大工具:正则表达式。正则表达式是一个强大的文本处理工具,可以用来匹配,搜索,替换和解析文本。我们将逐步展示如何在Python中使用正则表达式,包括其基本语法,常见用法和一些高级技巧。而在最后的“one more thing”部分,我们将探索一个不为人知但又非常有用的正则表达式的技巧。

简单正则表达式匹配

在Python中,re模块提供了正则表达式的支持。我们先从最简单的字符匹配开始。

import re

# 检查字符串是否包含字母"a"
txt = "Hello, world!"
match = re.search("a", txt)
print(match) # 输出:None,因为"a"没有在字符串中

在这个例子中,我们使用了re.search()函数来查找字符串中是否包含"a"。这是最基础的字符匹配,但已经可以看出正则表达式的用处。例如,你可以用这种方式检查一个电子邮件地址是否包含"@"。

使用元字符

正则表达式的真正威力在于其元字符的使用,比如.*?[]等等。下面的例子展示了如何使用.(点)元字符匹配任何字符(除了新行)。

txt = "Hello, world!"
match = re.search("H.llo", txt)
print(match.group()) # 输出:Hello

在这个例子中,.字符匹配了"e",使得"H.llo"可以匹配"Hello"。

使用预定义的字符集

有时我们希望匹配的是一类字符,而不是单个字符。比如,我们可能想要匹配任何数字。Python的正则表达式提供了预定义的字符集来实现这种功能。\d就代表任何数字。

txt = "123 Hello, world!"
match = re.search("\d+", txt)
print(match.group()) # 输出:123

在这个例子中,\d+匹配了一串数字"123"。

分组和捕获

我们可以使用圆括号()创建子模式或组,并使用group()方法来捕获这些组。

txt = "123 Hello, world!"
match = re.search("(\d+) (Hello),", txt)
print(match.group(1)) # 输出:123
print(match.group(2)) # 输出:Hello

使用正向先行断言

这是一个高级技巧,它允许我们在不消耗字符的情况下进行匹配。例如,我们可能想找出所有以句号结束但不包含句号的句子。

txt = "Hello. My name is Python. Nice to meet you."
matches = re.findall(".*?(?=\\.)", txt)
for match in matches:
print(match) # 输出:Hello,My name is Python,Nice to meet you

在这个例子中,.*?(?=\\.)匹配了所有以句号结束的句子,但并没有消耗句号。

字符集和范围

我们之前讨论过预定义的字符集,比如\d。但有时我们可能需要自定义字符集,我们可以使用方括号[]来达成这个目标。例如,我们可以创建一个只包含小写字母的字符集。

txt = "Hello, World!"
match = re.search("[a-z]+", txt)
print(match.group()) # 输出:ello

在这个例子中,[a-z]+匹配了一串连续的小写字母"ello"。注意"Hello"的首字母"H"由于是大写,没有被匹配。

贪婪匹配和非贪婪匹配

Python的正则表达式默认是贪婪的,这意味着它们会尽可能匹配更多的字符。但有时我们可能希望进行非贪婪匹配。我们可以通过在量词后面添加问号?来实现这个功能。

txt = "12345"
match = re.search("\d+?", txt)
print(match.group()) # 输出:1

在这个例子中,\d+?进行了非贪婪匹配,只匹配了一个数字"1"。

零宽断言

零宽断言允许我们在字符之间设置条件。比如,我们可以使用(?<=a)b来匹配所有在"a"后面的"b"。

txt = "cab, dab"
matches = re.findall("(?<=a)b", txt)
for match in matches:
print(match) # 输出:b,b

在这个例子中,(?<=a)b匹配了所有在"a"后面的"b"。

使用编译的正则表达式

如果你的程序需要多次使用同一个正则表达式,你可以将其编译为一个正则表达式对象。这可以提高代码的运行效率。

pattern = re.compile("\d+")
txt = "123 Hello, world!"
match = pattern.search(txt)
print(match.group()) # 输出:123

在这个例子中,我们先编译了正则表达式\d+,然后使用pattern.search()方法来进行匹配。

One More Thing

到现在为止,我们已经探讨了Python正则表达式的基础知识。但是在这最后的"One More Thing"部分,我想分享一个不常被提及,但在处理复杂文本模式时非常有用的技巧:命名组

命名组允许我们给匹配的组分配一个名字,然后在后面的代码中引用它。这在处理复杂的模式匹配时非常有用。

txt = "James: 1234567890"
match = re.search("(?P<name>\w+): (?P<phone>\d+)", txt)
print(match.group('name')) # 输出:James
print(match.group('phone')) # 输出:1234567890

在这个例子中,我们使用了命名组(?P<name>\w+)(?P<phone>\d+)来匹配名字和电话号码,并使用group()方法来获取它们。

正则表达式是一个非常强大的工具,希望本篇文章能帮你掌握它在Python中的用法。

如有帮助,请多关注

个人微信公众号:【Python全视角】

TeahLead_KrisChang,10+年的互联网和人工智能从业经验,10年+技术和业务团队管理经验,同济软件工程本科,复旦工程管理硕士,阿里云认证云服务资深架构师,上亿营收AI产品业务负责人。

Python正则表达式完全指南的更多相关文章

  1. Python正则表达式完全指南(上)

    正则表达式处理文本有如疾风扫秋叶,绝大部分编程语言都内置支持正则表达式,它应用在诸如表单验证.文本提取.替换等场景.爬虫系统更是离不开正则表达式,用好正则表达式往往能收到事半功倍的效果. 介绍正则表达 ...

  2. Python正则表达式基础指南

    1. 正则表达式基础 1.1. 简单介绍 正则表达式并不是Python的一部分.正则表达式是用于处理字符串的强大工具,拥有自己独特的语法以及一个独立的处理引擎,效率上可能不如str自带的方法,但功能十 ...

  3. Python正则表达式指南(转)

    目录 Python正则表达式指南(转) 0.防走丢 1. 正则表达式基础 1.1. 简单介绍 1.2. 数量词的贪婪模式与非贪婪模式 1.3. 反斜杠的困扰 1.4. 匹配模式 2. re模块 2.1 ...

  4. [转] Python正则表达式指南

    本文介绍了Python对于正则表达式的支持,包括正则表达式基础以及Python正则表达式标准库的完整介绍及使用示例.本文的内容不包括如何编写高效的正则表达式.如何优化正则表达式,这些主题请查看其他教程 ...

  5. 转:Python正则表达式指南

    本文介绍了Python对于正则表达式的支持,包括正则表达式基础以及Python正则表达式标准库的完整介绍及使用示例.本文的内容不包括如何编写高效的正则表达式.如何优化正则表达式,这些主题请查看其他教程 ...

  6. 比较详细Python正则表达式操作指南(re使用)

    比较详细Python正则表达式操作指南(re使用) Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式.Python 1.5之前版本则是通过 regex 模块提供 E ...

  7. python正则表达式 小例几则

    会用到的语法 正则字符 释义 举例 + 前面元素至少出现一次 ab+:ab.abbbb 等 * 前面元素出现0次或多次 ab*:a.ab.abb 等 ? 匹配前面的一次或0次 Ab?: A.Ab 等 ...

  8. Python天天美味(15) - Python正则表达式操作指南(re使用)(转)

    http://www.cnblogs.com/coderzh/archive/2008/05/06/1185755.html 简介 Python 自1.5版本起增加了re 模块,它提供 Perl 风格 ...

  9. python 正则表达式Re

    Python正则表达式指南这篇文章很好,推荐阅读. 本文则是简单记录下我自己学习Re的笔记, 环境是python3.5. 1.简单的Re语法 ^ 匹配字符串开始位置. $ 匹配字符串结束位置. \b ...

  10. python正则表达式Re模块备忘录

    title: python正则表达式Re模块备忘录 date: 2019/1/31 18:17:08 toc: true --- python正则表达式Re模块备忘录 备忘录 python中的数量词为 ...

随机推荐

  1. Git Commit Message 应该怎么写?

    原文链接: Git Commit Message 应该怎么写? 最近被同事吐槽了,说我代码提交说明写的太差.其实都不用他吐槽,我自己心里也非常清楚.毕竟很多时候犯懒,都是直接一个 -m "f ...

  2. Quartz 简单使用

    Scheduler 每次执行,都会根据JobDetail创建一个新的Job实例,这样就可以规避并发访问的问题(jobDetail的实例也是新的) Quzrtz 定时任务默认都是并发执行,不会等待上一次 ...

  3. 迁移学习(COAL)《Generalized Domain Adaptation with Covariate and Label Shift CO-ALignment》

    论文信息 论文标题:Generalized Domain Adaptation with Covariate and Label Shift CO-ALignment论文作者:Shuhan Tan, ...

  4. Callback详解

    Callbacks Callback Registration 在 Rails 中,回调(Callbacks)是一种在模型对象的生命周期中执行特定代码的机制.回调可以在模型对象的创建.更新.删除等操作 ...

  5. flink HelloWorld 之词频统计

    最近也在跟着学习flink,也是费了一点功夫才把开发环境都搭建了起来,做了一个简单的词频统计的demo- 准备工作 首先我们需要搭建需要的flink开发环境,我这里使用的是IDEA作为我的开发工具,所 ...

  6. 沁恒 CH32V208(三): CH32V208 Ubuntu22.04 Makefile VSCode环境配置

    目录 沁恒 CH32V208(一): CH32V208WBU6 评估板上手报告和Win10环境配置 沁恒 CH32V208(二): CH32V208的储存结构, 启动模式和时钟 沁恒 CH32V208 ...

  7. boot-admin整合Liquibase实现数据库版本管理

    Liquibase 和 Flyway 是两款成熟的.优秀的.开源/商业版的数据库版本管理工具,鉴于 Flyway 的社区版本对 Oracle 数据库支持存在限制,所以 boot-admin 选择整合 ...

  8. 【Docker】镜像管理

    一.搜索镜像 1.在官方网站搜索镜像 Docker 官方镜像仓库:https://hub.docker.com/ 2.docker search 搜索镜像 Usage: docker search [ ...

  9. 2023-05-08:我们定义了一个函数 countUniqueChars(s) 来统计字符串 s 中的唯一字符, 并返回唯一字符的个数。 例如:s = “LEETCODE“ ,则其中 “L“, “T

    2023-05-08:我们定义了一个函数 countUniqueChars(s) 来统计字符串 s 中的唯一字符, 并返回唯一字符的个数. 例如:s = "LEETCODE" ,则 ...

  10. Linux xfs文件系统stat命令Birth字段为空的原因探究

    在Linux平台找出某个目录下创建时间最早的文件,测试验证脚本结果是否准确的过程中发现一个很有意思的现象,stat命令在一些平台下Birth字段有值,而在一些平台则为空值,如下所示: RHEL 8.7 ...