[Python 实战] - No.12 Python 中的正则表达式使用

2024-04-12 14:32

本文主要是介绍[Python 实战] - No.12 Python 中的正则表达式使用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. Python中如何使用正则表达式

Python中使用正则表达式的步骤如下:

  • 使用import re导入正则表达式模块
  • 使用re.compile()创建一个对象
  • 使用Regex对象的search()方法,传入一个字符串,然后返回一个Match对象
  • 调用Match对象的group()方法,返回文本中匹配该正则表达式的字符串

示例如下,查找学生姓名中姓Zhang的同学姓名

import renamelist = "Li Ming;Zhang San;Fu yu;Guo Ji;Ren Jie;Zhang Lin;"
nameRegex = re.compile(r"Zhang\s\w+")
match = nameRegex.search(namelist)
print(match.group())

结果如下:

Zhang San

上面的代码中,有几个地方需要解释一下:

  • re.compile(r"Zhang San\s\w+")在正则表达式的前面加了一个r,标识该字符为原始字符串。因为,在Python中,转义字符前面需要加\来标记,如果你需要在字符串中打出\,那么你需要使用\\,或者在字符串的前面加入一个r来标记

    r"Zhang San\s\w+""Zhang San\\s\\w+"是等价的

  • search()函数匹配文本中第一个符合该字符串的结果并返回一个Match对象,Match对象的group()函数将返回被查找到的实际文本。所以在上述结果中,我们仅得到Zhang San这个结果。如果你的正则表达式中含有分组(后续会讲到),你可以使用group(1), group(2)来查询正则表达式中第一个,第二个分组的匹配结果。

2. 正则表达式的更多模式
1. 使用括号分组

假设,某地区的电话号码的表示形式为123-456-7890的形式,且前三位为区号,后七位标识电话号,要求将从文本中同时获取区号,电话号和整体的电话号码。

代码和结果如下:

text = "My phone number is 455-789-1234"
pnRegex = re.compile(r"(\d\d\d)-(\d\d\d-\d\d\d\d)")
match = pnRegex.search(text)
print(match.group())
print(match.group(1))
print(match.group(2))
print(match.groups())

结果如下:

455-789-1234
455
789-1234
(‘455’, ‘789-1234’)

group()默认传入参数为0,即返回整个匹配的文本。如果想获取全体分组的结果,使用groups()函数,该函数返回一个包含所有分组匹配结果的元组。

2. 使用管道匹配多个分组

字符|是正则表达式中的管道,用来匹配许多表达式中的一个。如果想匹配姓名列表中,姓Zhang的和姓Li的同学的姓名,可以使用管道|来连接多个正则表达式。

 namelist1 = "Li Ming;Zhang San;Fu yu;Guo Ji;Ren Jie;Zhang Lin;"namelist2 = "Zhang San;Fu yu;Guo Ji;Ren Jie;Zhang Lin;Li Ming;"nameRegex = re.compile(r"Zhang\s\w+|Li\s\w+")match1 = nameRegex.search(namelist1)print(match1.group())match2 = nameRegex.search(namelist2)print(match2.group())

结果如下:

Li Ming
Zhang San

3. 使用问号实现可选匹配

例如在之前的电话匹配中,我们希望即便有人省略区号,依然可以检测出电话号码。使用?来实现部分匹配的模式是可选的

text1 = "My phone number is 455-789-1234"
text2 = "My phone number is 789-1234"
pnRegex = re.compile(r"(\d\d\d-)?(\d\d\d-\d\d\d\d)")
match1 = pnRegex.search(text1)
print(match1.group())
match2 = pnRegex.search(text2)
print(match2.group())

结果如下:

455-789-1234
789-1234

4. 使用花括号匹配特定次数

假设现在我们有一串字符串:

* *** ********** ** *** ****** ** ***** * ******* ***** **** ***** * *** * **

如果我们想匹配一下几种情况:

  • 恰好三个* 连在一起的,如***
  • 少于等于三个* 连在一起的,如**,*
  • 连在一起的*个数大于等于四,但是小于等于五
  • 大于等于六个*连在一起的,如******

代码如下:

text = "* *** ********** ** **** ****** ** ***** * ******* ***** **** ***** * *** * **"
sRegex1 = re.compile(r"(\*){3}")
sRegex2 = re.compile(r"(\*){,3}")
sRegex3 = re.compile(r"(\*){4,5}")
sRegex4 = re.compile(r"(\*){6,}")
match1 = sRegex1.search(text)
match2 = sRegex2.search(text)
match3 = sRegex3.search(text)
match4 = sRegex4.search(text)
print(match1.group())
print(match2.group())
print(match3.group())
print(match4.group())

结果如下所示:

***
*
*****
**********

r"(\*){3}"中,(\*)表示匹配*型字符的分组。因为 *在正则表达式中表示匹配一个或多个,所以需要使用\进行转义,表示字符 *

花括号{n,m},表示前面的分组重复次数大于等于n次并且小于等于m次。m和n也可省略其中一个,表示大于等于n或者小于等于m。{n}表示分组恰好重复n次。

另外,可以看到,在被匹配的文本中,长度为4的字符串****排在长度为5的字符串***** 前面,但是代码查找到的结果是*****,这是因为默认情况下正则表达式是贪婪地,花括号的贪婪版本会尽可能的匹配更长的字符串。使用字符?可以声明正则表达式为非贪心形式

text = "* *** ********** ** *** ****** **** ***** * ******* ***** **** ***** * *** * **"
sRegex1 = re.compile(r"(\*){4,5}")
match1 = sRegex1.search(text)
sRegex2 = re.compile(r"(\*){4,5}?")
match2 = sRegex2.search(text)
print(match1.group())
print(match2.group())

结果如下:

*****
****
5. findall()方法

re模块的findall()方法返回被匹配文本中的所有匹配到的结果。

之前提到的search() 仅返回文本中第一个匹配到的结果,方法返回一个Match对象,并调用Match对象的group()函数获取匹配结果

findall()匹配文本中所有匹配的结果,并且返回一个所有结果的列表。如果正则表达式中有分组,那么findall()将返回分组的列表

比如之前的电话号的正则表达式:

text = "My phone number is 455-789-1234,Lily's phone number is 110-101-1230 and Lucy's phone number is 789-456-1245"
pnRegex = re.compile(r"(\d\d\d)-(\d\d\d-\d\d\d\d)")
reslist = pnRegex.findall(text)
print(reslist)

结果如下:

[(‘455’, ‘789-1234’), (‘110’, ‘101-1230’), (‘789’, ‘456-1245’)]

6. sub()函数和compile()函数

前面我们使用了re.compile() 来构造特定正则表达式的Regex对象,compile()函数具体的签名如下:

def compile(pattern, flags=0)

所以我们可以在compile()追加第二个参数,实现特定功能。

例如:检索文本中所有的Alice词语,不区分大小写,代码如下

text = "Alice is aLice,aliCe,and ALIcE.But it's not Bob."
regex = re.compile("Alice", re.IGNORECASE)
res = regex.findall(text)
print(res)

结果如下所示:

[‘Alice’, ‘aLice’, ‘aliCe’, ‘ALIcE’]

flags`的其他参数如下:

参数缩写用途
re.IGNORECASEre.IPerform case-insensitive matching.
re.LOCALEre.LMake \w, \W, \b, \B, dependent on the current locale.
re.MULTILINEre.M“^” matches the beginning of lines (after a newline) as well as the string. “$” matches the end of lines (before a newline) as well as the end of the string.
re.DOTALLre.D“.” matches any character at all, including the newline.
re.VERBOSEre.XIgnore whitespace and comments for nicer looking RE’s.
re.UNICODEre.UFor compatibility only. Ignored for string patterns (it is the default), and forbidden for bytes patterns.

sub()函数可以用于替换正则表达式查找到的字符串。例如,我们将之前字符串中所有的Alice的姓名隐藏:

text = "Alice is aLice,aliCe,ALIcE.But it's not Bob."
regex = re.compile(r"(A)(\w+)", re.IGNORECASE)
print(regex.sub(r'\1****',text))

结果如下所示:

A**** is a****,a****,A****.But it’s not Bob.

sub()函数第一个参数是要替换为的字符串,第二个参数是匹配的正则表达式。另外在sub()函数的第一个参数中,可以使用\1,\2 …来表示替换分组1,2…中的文本

正则表达式中的常用字符表,网上资源很多,这里不再放出来。


P.S. 文章不足之处还望指正
参考书籍:《Python编程快速上手—让繁琐工作自动化》

这篇关于[Python 实战] - No.12 Python 中的正则表达式使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/897401

相关文章

网页解析 lxml 库--实战

lxml库使用流程 lxml 是 Python 的第三方解析库,完全使用 Python 语言编写,它对 XPath表达式提供了良好的支 持,因此能够了高效地解析 HTML/XML 文档。本节讲解如何通过 lxml 库解析 HTML 文档。 pip install lxml lxm| 库提供了一个 etree 模块,该模块专门用来解析 HTML/XML 文档,下面来介绍一下 lxml 库

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

python: 多模块(.py)中全局变量的导入

文章目录 global关键字可变类型和不可变类型数据的内存地址单模块(单个py文件)的全局变量示例总结 多模块(多个py文件)的全局变量from x import x导入全局变量示例 import x导入全局变量示例 总结 global关键字 global 的作用范围是模块(.py)级别: 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数

Makefile简明使用教程

文章目录 规则makefile文件的基本语法:加在命令前的特殊符号:.PHONY伪目标: Makefilev1 直观写法v2 加上中间过程v3 伪目标v4 变量 make 选项-f-n-C Make 是一种流行的构建工具,常用于将源代码转换成可执行文件或者其他形式的输出文件(如库文件、文档等)。Make 可以自动化地执行编译、链接等一系列操作。 规则 makefile文件

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

pdfmake生成pdf的使用

实际项目中有时会有根据填写的表单数据或者其他格式的数据,将数据自动填充到pdf文件中根据固定模板生成pdf文件的需求 文章目录 利用pdfmake生成pdf文件1.下载安装pdfmake第三方包2.封装生成pdf文件的共用配置3.生成pdf文件的文件模板内容4.调用方法生成pdf 利用pdfmake生成pdf文件 1.下载安装pdfmake第三方包 npm i pdfma