Python正则表达式一文详解+实例代码展示(上)

简介: Python正则表达式一文详解+实例代码展示

一、正则表达式


1.简介


   正则表达式,又称规则表达式,(Regular Expression,在代码中常简写为regex、regexp或RE),是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为"元字符"),是计算机科学的一个概念。正则表达式是对字符串(包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为“元字符”))操作的一种逻辑公式,就是用事先定义好的一些特定字符及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。正则表达式是一种文本模式,该模式描述在搜索文本时要匹配的一个或多个字符串。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串,通常被用来检索、替换那些符合某个模式(规则)的文本。    


       许多程序设计语言都支持利用正则表达式进行字符串操作。例如,在Perl中就内建了一个功能强大的正则表达式引擎。正则表达式这个概念最初是由Unix中的工具软件(例如sed和grep)普及开来的,后来在广泛运用于Scala 、PHP、C# 、Java、C++ 、Objective-c、Perl 、Swift、VBScript 、Javascript、Ruby 以及Python等等。正则表达式通常缩写成“regex”,单数有regexp、regex,复数有regexps、regexes、regexen。


2.概念


       正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。


3.目的


给定一个正则表达式和另一个字符串,我们可以达到如下的目的:

  • 判断给定的字符串是否符合正则表达式的过滤逻辑(称作“匹配”):
  • 可以通过正则表达式,从字符串中获取我们想要的特定部分。


4.特点


正则表达式的特点是:

  • 灵活性、逻辑性和功能性非常强;
  • 可以迅速地用极简单的方式达到字符串的复杂控制。
  • 对于刚接触的人来说,比较晦涩难懂。


二、Re库


re库是Python自带的标准库,不需要安装即可使用:

Re库默认采用贪婪匹配,即输出匹配最长的子串


import re


模块常用函数:


1.re.match()


基础语法形式为:


re.match(pattern,string,flags=0)


函数功能为 :从一个字符串的开始位置起匹配正则表达式,返回match对象。如果开始没有匹配到,不管后边有没有能符合匹配的,都打印不出结果,这是和search的区别。


参数说明:


pattern:匹配目标对象的正则表达式pattern或原生字符串表示

string:匹配的字符串

flags:正则表达式使用时的控制标记

其中flags可选参数有:


参数 说明

re.l/re.IGNORECASE 忽略大小写

re.M/re.MULTILINE 多行模式,改变‘^'和'$'的行为

re.S/re.DOTALL 点'.'的任意匹配模式,改变’.‘的行为

re.L/re.LOCALE


使预定字符类\w\W\b\B\s\S取决于当前区域设定

re.U/re.UNICODE 使预定字符类\w\W\b\B\s\S\d\D取决于unicode定义的字符属性

re.X/re.VERBOSE 详细模式。这个模式下正则表达式可以是多行,忽略空白字符,并且可以加入注释


我们把复杂的匹配放到第三章再写,这里我们仅简单展示一下该函数的用法和效果:


strings='Fanstuck wants to leave alone'
print(re.match('Fanstuck',strings))
#out: <re.Match object; span=(0, 8), match='Fanstuck'>


2.fullmatch()


基础语法格式为:


fullmatch(pattern, string, flags=0)


参数说明:


pattern:匹配目标对象的正则表达式pattern或原生字符串表示

string:匹配的字符串

flags:正则表达式使用时的控制标记

函数功能为 :尝试将正则表达式pattern应用于所有字符串string,如果匹配成功,返回匹配对象;如果找不到匹配,则为“None”。


用法效果展示:

strings='Fanstuck wants to leave alone'
print(re.fullmatch('Fanstuck wants to leave alone',strings))
#out: <re.Match object; span=(0, 29), match='Fanstuck wants to leave alone'>


该函数为贪婪规则指定的pattern都必须完全和strings长度和字符一一对应,否则就是None:

strings='Fanstuck wants to leave alone'
print(re.fullmatch('Fanstuck wants to leave alon',strings))
#out: None


3.search()


基础语法格式为:


search(pattern, string, flags=0)


参数说明:


pattern:匹配目标对象的正则表达式pattern或原生字符串表示

string:匹配的字符串

flags:正则表达式使用时的控制标记

函数功能为 :扫描字符串string以查找与正则表达式pattern的匹配项,返回匹配对象;如果找不到匹配,则为“None”。 re.search 匹配整个字符串,直到找到一个匹配。

strings='Fanstuck wants to leave alone'
print(re.search('alone',strings))
#out:<re.Match object; span=(24, 29), match='alone'>
strings='Fanstuck wants to leave alone'
print(re.search('die',strings))
#out:None

4. sub()


基本语法格式为:


sub(pattern, repl, string, count=0, flags=0)


参数说明:


  • pattern:匹配目标对象的正则表达式pattern或原生字符串表示
  • repl:将匹配到的pattern替换为repl
  • string:匹配的字符串
  • count:模式匹配后替换的最大次数,默认 0 表示替换所有的匹配
  • flags:正则表达式使用时的控制标记
strings='Fanstuck wants to leave alone alonely'
print(re.sub('leave','die',strings))
#out:Fanstuck wants to die alone alonely


strings='Fanstuck wants to leave alone alonely'
print(re.sub('alone','sad',strings))
#out:Fanstuck wants to leave sad sadly

5.subn()


基础语法格式为:


subn(pattern, repl, string, count=0, flags=0)


参数说明:


pattern:匹配目标对象的正则表达式pattern或原生字符串表示

repl:将匹配到的pattern替换为repl

string:匹配的字符串

count:模式匹配后替换的最大次数,默认 0 表示替换所有的匹配

flags:正则表达式使用时的控制标记

与前一个函数sub相比,无非就是增加了一个次数:

strings='Fanstuck wants to leave alone alonely'
print(re.subn('alone','sad',strings))
#out:('Fanstuck wants to leave sad sadly', 2)


但是转化为字典dict或者是用于pandas都是比较方便的,不用在统计出匹配了多少个字段。


6.findall()


基础语法格式为:

findall(pattern, string, flags=0)
findall(pattern,string, pos, endpos)

参数说明:


pattern:匹配目标对象的正则表达式pattern或原生字符串表示

string:匹配的字符串

flags:正则表达式使用时的控制标记

pos:可选参数,指定字符串的起始位置,默认为 0。

endpos:可选参数,指定字符串的结束位置,默认为字符串的长度

函数功能为 :在字符串string中匹配所有符合正则表达式pattern的对象,并把这些对象通过列表list的形式返回。

strings='Fanstuck wants to leave alone alonely'
print(re.findall('alone',strings))
#out:['alone', 'alone']
strings='Fanstuck wants to leave alone alonely'
print(re.findall('alonely',strings))
#out:['alonely']
strings='Fanstuck wants to leave alone alonely'
pattern=re.compile('a')
print(pattern.findall(strings,0,30))

7.finditer()


基础语法格式为:


finditer(pattern, string, flags=0)


参数说明:

  • pattern:匹配目标对象的正则表达式pattern或原生字符串表示
  • string:匹配的字符串
  • flags:正则表达式使用时的控制标记

函数功能为:在字符串string中匹配所有符合正则表达式pattern的对象,并把这些对象通过迭代器的形式返回。


strings='Fanstuck wants to leave alone alonely'
result=re.finditer('alone',strings)
for i in result:
    print(i)
#out:<re.Match object; span=(24, 29), match='alone'>
#out:<re.Match object; span=(30, 35), match='alone'>


8.compile()


基础语法格式为:


compile(pattern, flags=0)


  • pattern:匹配目标对象的正则表达pattern或原生字符串表示
  • flags:正则表达式使用时的控制标记


compile 函数用于编译正则表达式,生成一个正则表达式( Pattern )对象,供 match() 和 search() 这两个函数使用。


strings='Fanstuck wants to leave alone alonely'
pattern=re.compile('to')
pattern.search(strings)
#out:<re.Match object; span=(15, 17), match='to'>
strings='Fanstuck wants to leave alone alonely'
pattern=re.compile('to')
object_search=pattern.search(strings)
object_search.group()
#out:'to'
object_search.start()
#out:15
object_search.end()
#out:17
object_search.span()
#out:(15,17)

9. splite()


基础语法格式为:


re.splite(pattern, string, maxsplit=0, flags=0)


参数说明:


pattern:匹配目标对象的正则表达式pattern或原生字符串表示

string:匹配的字符串

maxsplit:分隔次数,maxsplit=1 分隔一次,默认为 0,不限制次数

flags:正则表达式使用时的控制标记

pattern匹配的子串来分割string,如果pattern里使用了圆括号,那么被pattern匹配到的串也将作为返回值列表的一部分,maxsplit为最多被分割的字符串个数。


strings='Fanstuck wants to leave alone alonely'
re.split(r' ', strings)
#out:['Fanstuck', 'wants', 'to', 'leave', 'alone', 'alonely']
strings='Fanstuck wants to leave alone alonely'
re.split(r' ', strings,maxsplit=2)
#out:['Fanstuck', 'wants', 'to leave alone alonely']
strings='Fanstuck wants to leave alone alonely'
re.split(r'( )', strings,maxsplit=2)
#out:['Fanstuck', ' ', 'wants', ' ', 'to leave alone alonely']

10.Match对象和Pattern对象


re.match()、re.search()成功匹配的话都会返回一个Match对象,它包含了关于此次匹配的信息,可以使用Match提供的属性或方法来获取这些信息;Pattern对象对象由re.compile()生成,而且方法用处也是一样的。


strings='Fanstuck wants to leave alone alonely'
pattern=re.compile('to')
object_search=pattern.search(strings)
object_search.string
#out:'Fanstuck wants to leave alone alonely'
object_search.re
#out:re.compile(r'to', re.UNICODE)
object_search.pos
#out:0 (开始匹配的位置)
object_search.endpos
#out:37(结束匹配的位置)
object_search.lastindex
#out:None
object_search.lastgroup
#out:None
object_search.groupdict()
#out:{}
object_search.group()
#out:'to'
object_search.start()
#out:15
object_search.end()
#out:17
object_search.span()
#out:(15,17)


目录
相关文章
|
6天前
|
缓存 监控 测试技术
Python中的装饰器:功能扩展与代码复用的利器###
本文深入探讨了Python中装饰器的概念、实现机制及其在实际开发中的应用价值。通过生动的实例和详尽的解释,文章展示了装饰器如何增强函数功能、提升代码可读性和维护性,并鼓励读者在项目中灵活运用这一强大的语言特性。 ###
|
9天前
|
缓存 开发者 Python
探索Python中的装饰器:简化代码,增强功能
【10月更文挑战第35天】装饰器在Python中是一种强大的工具,它允许开发者在不修改原有函数代码的情况下增加额外的功能。本文旨在通过简明的语言和实际的编码示例,带领读者理解装饰器的概念、用法及其在实际编程场景中的应用,从而提升代码的可读性和复用性。
|
8天前
|
Python
在Python中,可以使用内置的`re`模块来处理正则表达式
在Python中,可以使用内置的`re`模块来处理正则表达式
20 5
|
6天前
|
Python
探索Python中的装饰器:简化代码,提升效率
【10月更文挑战第39天】在编程的世界中,我们总是在寻找使代码更简洁、更高效的方法。Python的装饰器提供了一种强大的工具,能够让我们做到这一点。本文将深入探讨装饰器的基本概念,展示如何通过它们来增强函数的功能,同时保持代码的整洁性。我们将从基础开始,逐步深入到装饰器的高级用法,让你了解如何利用这一特性来优化你的Python代码。准备好让你的代码变得更加优雅和强大了吗?让我们开始吧!
14 1
|
11天前
|
设计模式 缓存 监控
Python中的装饰器:代码的魔法增强剂
在Python编程中,装饰器是一种强大而灵活的工具,它允许程序员在不修改函数或方法源代码的情况下增加额外的功能。本文将探讨装饰器的定义、工作原理以及如何通过自定义和标准库中的装饰器来优化代码结构和提高开发效率。通过实例演示,我们将深入了解装饰器的应用,包括日志记录、性能测量、事务处理等常见场景。此外,我们还将讨论装饰器的高级用法,如带参数的装饰器和类装饰器,为读者提供全面的装饰器使用指南。
|
6天前
|
存储 缓存 监控
掌握Python装饰器:提升代码复用性与可读性的利器
在本文中,我们将深入探讨Python装饰器的概念、工作原理以及如何有效地应用它们来增强代码的可读性和复用性。不同于传统的函数调用,装饰器提供了一种优雅的方式来修改或扩展函数的行为,而无需直接修改原始函数代码。通过实际示例和应用场景分析,本文旨在帮助读者理解装饰器的实用性,并鼓励在日常编程实践中灵活运用这一强大特性。
|
11天前
|
存储 算法 搜索推荐
Python高手必备!揭秘图(Graph)的N种风骚表示法,让你的代码瞬间高大上
在Python中,图作为重要的数据结构,广泛应用于社交网络分析、路径查找等领域。本文介绍四种图的表示方法:邻接矩阵、邻接表、边列表和邻接集。每种方法都有其特点和适用场景,掌握它们能提升代码效率和可读性,让你在项目中脱颖而出。
25 5
|
9天前
|
机器学习/深度学习 数据采集 人工智能
探索机器学习:从理论到Python代码实践
【10月更文挑战第36天】本文将深入浅出地介绍机器学习的基本概念、主要算法及其在Python中的实现。我们将通过实际案例,展示如何使用scikit-learn库进行数据预处理、模型选择和参数调优。无论你是初学者还是有一定基础的开发者,都能从中获得启发和实践指导。
20 2
|
11天前
|
数据库 Python
异步编程不再难!Python asyncio库实战,让你的代码流畅如丝!
在编程中,随着应用复杂度的提升,对并发和异步处理的需求日益增长。Python的asyncio库通过async和await关键字,简化了异步编程,使其变得流畅高效。本文将通过实战示例,介绍异步编程的基本概念、如何使用asyncio编写异步代码以及处理多个异步任务的方法,帮助你掌握异步编程技巧,提高代码性能。
29 4
|
12天前
|
缓存 开发者 Python
探索Python中的装饰器:简化和增强你的代码
【10月更文挑战第32天】 在编程的世界中,简洁和效率是永恒的追求。Python提供了一种强大工具——装饰器,它允许我们以声明式的方式修改函数的行为。本文将深入探讨装饰器的概念、用法及其在实际应用中的优势。通过实际代码示例,我们不仅理解装饰器的工作方式,还能学会如何自定义装饰器来满足特定需求。无论你是初学者还是有经验的开发者,这篇文章都将为你揭示装饰器的神秘面纱,并展示如何利用它们简化和增强你的代码库。