Python正则表达式完全指南
本篇文章将深入探讨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正则表达式完全指南的更多相关文章
- Python正则表达式完全指南(上)
正则表达式处理文本有如疾风扫秋叶,绝大部分编程语言都内置支持正则表达式,它应用在诸如表单验证.文本提取.替换等场景.爬虫系统更是离不开正则表达式,用好正则表达式往往能收到事半功倍的效果. 介绍正则表达 ...
- Python正则表达式基础指南
1. 正则表达式基础 1.1. 简单介绍 正则表达式并不是Python的一部分.正则表达式是用于处理字符串的强大工具,拥有自己独特的语法以及一个独立的处理引擎,效率上可能不如str自带的方法,但功能十 ...
- Python正则表达式指南(转)
目录 Python正则表达式指南(转) 0.防走丢 1. 正则表达式基础 1.1. 简单介绍 1.2. 数量词的贪婪模式与非贪婪模式 1.3. 反斜杠的困扰 1.4. 匹配模式 2. re模块 2.1 ...
- [转] Python正则表达式指南
本文介绍了Python对于正则表达式的支持,包括正则表达式基础以及Python正则表达式标准库的完整介绍及使用示例.本文的内容不包括如何编写高效的正则表达式.如何优化正则表达式,这些主题请查看其他教程 ...
- 转:Python正则表达式指南
本文介绍了Python对于正则表达式的支持,包括正则表达式基础以及Python正则表达式标准库的完整介绍及使用示例.本文的内容不包括如何编写高效的正则表达式.如何优化正则表达式,这些主题请查看其他教程 ...
- 比较详细Python正则表达式操作指南(re使用)
比较详细Python正则表达式操作指南(re使用) Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式.Python 1.5之前版本则是通过 regex 模块提供 E ...
- python正则表达式 小例几则
会用到的语法 正则字符 释义 举例 + 前面元素至少出现一次 ab+:ab.abbbb 等 * 前面元素出现0次或多次 ab*:a.ab.abb 等 ? 匹配前面的一次或0次 Ab?: A.Ab 等 ...
- Python天天美味(15) - Python正则表达式操作指南(re使用)(转)
http://www.cnblogs.com/coderzh/archive/2008/05/06/1185755.html 简介 Python 自1.5版本起增加了re 模块,它提供 Perl 风格 ...
- python 正则表达式Re
Python正则表达式指南这篇文章很好,推荐阅读. 本文则是简单记录下我自己学习Re的笔记, 环境是python3.5. 1.简单的Re语法 ^ 匹配字符串开始位置. $ 匹配字符串结束位置. \b ...
- python正则表达式Re模块备忘录
title: python正则表达式Re模块备忘录 date: 2019/1/31 18:17:08 toc: true --- python正则表达式Re模块备忘录 备忘录 python中的数量词为 ...
随机推荐
- GO实现Redis:GO实现Redis的AOF持久化(4)
将用户发来的指令以RESP协议的形式存储在本地的AOF文件,重启Redis后执行此文件恢复数据 https://github.com/csgopher/go-redis 本文涉及以下文件: redis ...
- 机器学习(三):朴素贝叶斯+贝叶斯估计+BP人工神经网络习题手算|手工推导与习题计算
1.有 1000 个水果样例. 它们可能是香蕉,橙子或其它水果,已知每个水果的 3 种特性:是否偏长.是否甜.颜色是否是黄色 类型 长 不长 甜 不甜 黄色 非黄 Total 香蕉 400 100 3 ...
- 明解STM32—GPIO理论基础知识篇之寄存器原理
一.前言 在之前的STM32的GPIO理论基础知识中,分别对基本结构和工作模式进行了详细的介绍.GPIO基本结构中主要对GPIO内部的各个功能电路逐一的进行的分析:GPIO工作模式中主要介绍GPI ...
- EF Core从TPH迁移到TPT
Intro EF Core支持多种方式处理具有继承关系的表,现在支持TPH.TPC(EF Core 7).TPT,具体的实现方式可以参考官方文档和这篇文章. 大致总结一下不同的方式的区别: TPH:所 ...
- Django笔记十六之aggregate聚合操作
本文首发于微信公众号:Hunter后端 原文链接:Django笔记十六之aggregate聚合操作 这一篇笔记介绍一下关于聚合的操作,aggregate. 常用的聚合操作比如有平均数,总数,最大值,最 ...
- flask-wtfwkfom使用
我们在使用flask框架来搭建自己的博客,只要是设涉及到表单相关,必然会想起Flask-WTF与WTForms.对于flask初学者来说,比较容易混淆两者.今天想来一一解释两者的用法. Flask-W ...
- pandas之分类操作
通常情况下,数据集中会存在许多同一类别的信息,比如相同国家.相同行政编码.相同性别等,当这些相同类别的数据多次出现时,就会给数据处理增添许多麻烦,导致数据集变得臃肿,不能直观.清晰地展示数据. 针对上 ...
- 0002 嵌入式开发带你从小白到大佬系列之——Linux文件系统、常用文件操作命令(一)及用户权限
1.熟悉Linux的文件系统结构 Linux的文件系统结构其实是一个树形的分层组织结构,如下图: Linux系统目录结构及目录路径: 1.1.文件系统层次结构标准 Linux是开源的操作系统,各个Li ...
- redhat6安装10g rac过程中的报错
问题描述:redhat 6 来安装oracle10.2.0.1的集群,坑太多了,不建议这样安装,即使安装成功,在升级过程中也会有各种报错.redhat5安装还比较顺利,6就一路坑 1.缺少依赖 lib ...
- YII2.0使用ActiveForm表单
Controller控制器层代码 <?php namespace frontend\controllers; use frontend\models\UserForm; class UserCo ...