Python----Python高级(正则表达式:语法规则,re库)

一、正则表达式

1.1、概念

正则表达式,又称规则表达式,(Regular Expression,在代码中常简写为regex、 regexp或RE),是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特 殊字符(称为"元字符")。

正则表达式使用单个字符串来描述、匹配一系列符合某个 句法规则的字符串,通常被用来检索、替换那些符合某个模式(规则)的文本。通俗 的说,正则表达式就是一种语法规则,用来匹配文本中的文本。

正则表达式非常强大,不仅在UNIX系统中应用广泛,近二十年来,在Windows系统 中也得到极大的发展,现如今主流的操作系统包括Linux、Unix、Windows和主流的 开发语言包括C/C++、Java、JavaScript、C#、Python、Go、PHP等。

1.2、特点

缺点:

正则表达式的语法可读性差

优点:

正则表达式通用行很强,能够适用于很多编程语言

二、语法规则

2.1、匹配什么字符

代码 功能
. 匹配任意1个字符(除了\n)
匹配 中列举的字符
\d 匹配数字,即0-9
\D 匹配非数字,即不是数字
\s 匹配空白,即 空格,tab键
\S 匹配非空白
\w 匹配非特殊字符,即a-z、A-Z、0-9、_、汉字
\W 匹配特殊字符,即非字母、非数字、非汉字

2.2、匹配多少次

代码 功能
* 匹配前一个字符出现0次或者无限次,即可有可无
+ 匹配前一个字符出现1次或者无限次,即至少有1次
? 匹配前一个字符出现1次或者0次,即要么有1次,要么没有
{m} 匹配前一个字符出现m次
{m,n} 匹配前一个字符出现从m到n次
{n,} 匹配前一个字符出现n次以上

2.3、在哪里匹配

代码 功能
^ 匹配字符串开头
$ 匹配字符串结尾
\b 表示匹配单词边界。(比如\bword,可以匹配word、words,但不会匹配 sword)

2.4、匹配指定格式的字符

1. 使用()匹配指定格式的字符

(ab):表示在文本中只匹配ab这两个字符,且必须相邻

(a|b):表示在文本中匹配a或者b这两个字符,不一定相邻。

2. 使用\[\]匹配指定类别的字符串

abcd:表示匹配a或匹配b或匹配c或匹配d

a-d:表示匹配a或匹配b或匹配c或匹配d

a-zA-Z0-9:表示匹配所有的大小写英文和数字

\^0-9:表示匹配除了数字之外的所有字符

2.5、单行模式与多行模式

1. 单行模式:

在单行模式下,.可以匹配任何的字符,包括换行符,并且整个文本会 被认为是一个完整的文本,使用^和$只能匹配到文本的开头和结尾。

2. 多行模式:

在多行模式下,.就不可以匹配换行符了,使用^和$可以匹配到每一行 的开始和结束。

2.6、贪婪匹配与懒惰匹配

1. 贪婪模式:指在正则表达式中的量词会尽可能多地匹配字符。

2. 懒惰模式:指在正则表达式中的量词会尽可能少地匹配字符。

2.7、?的几种用法

  1. ?作为限定符,表示其修饰对象只能出现0次或1次。

  2. ?放在量词前,表示将匹配模式改为懒惰匹配模式。

  3. (?=pattern):表示匹配位置后面必须跟着pattern模式的字符,匹配结果并不 包括这个模式的字符串。

  4. (?!pattern):表示匹配位置后面不能跟着pattern模式的字符,匹配结果并不 包括这个模式的字符串。

  5. (?<=pattern):表示匹配位置前面必须跟着pattern模式的字符,匹配结果并 不包括这个模式的字符串。

6.(?<!pattern):表示匹配位置前面不能跟着pattern模式的字符,匹配结果并不 包括这个模式的字符串

7.(?:pattern):表示将 pattern 包含在一个分组中,但不把这个分组的匹配结果 保存到分组编号中。

三、Python中的re库

3.1、re.match

该函数尝试从字符串的起始位置匹配,如果起始位置没有匹配成功的话,就返回 None,否则会返回一个匹配对象
re.match(pattern,string,flags=0)

pattern:正则表达式的格式。

string:被匹配的文本。

flags:标志位,用于控制正则表达式的匹配方式
应用场景

验证输入格式:检查用户输入是否符合特定的格式,例如电子邮件、电话号码、 日期等

提取信息:从字符串的开始位置提取符合正则表达式模式的字串,如提取文件名 等。

数据解析:在处理日志文件或配置文件时,可以用来解析每行的开始部分,获取 关键信息。

python 复制代码
import re


m = re.match('foo', 'food') # 返回匹配对象
print(m) # <re.Match object; span=(0, 3), match='foo'>


m = re.match('foo', 'fbar') # 不匹配,返回None
print(m) # None

3.2、re.search

从文本中获取第一个符合正则表达式模式的字符的位置,并返回一个匹配对 象,如果没有匹配到,就返回None。
re.search(pattern,string,flags=0)

pattern:正则表达式的格式。

string:被匹配的文本。

flags:标志位,用于控制正则表达式的匹配方式
应用场景

检查字符串是否包含子串:检查一个字符串是否包含某个特定的文本。

提取数据:从字符串中的任意位置提取信息,例如从一个文本段落中提取所有提 到的日期。

搜索文件:在某文件中查找特定的消息或事件。

python 复制代码
import re


m = re.search('foo', 'hellofood')  
print(m) # <re.Match object; span=(6, 9), match='foo'>


m = re.search('foo', 'hello')  
print(m) # None

3.3、re.findall

数从文本中寻找所有与模式匹配的子串,并将所有的匹配结果存储到一个列表中 进行返回,如果没有匹配成功会返回一个空列表。
re.findall(pattern,string,flags=0)

pattern:正则表达式的格式。

string:被匹配的文本。

flags:标志位,用于控制正则表达式的匹配方式
应用场景

提取多个子串:当你需要在字符串中找到所有匹配特定模式的字串时。

文本分析:在文本中,提取文本中特定的词汇、短语或模式。

python 复制代码
import re


lst = re.findall('ab', 'abcdabcdabcd') 
print(lst) # ['ab', 'ab', 'ab']

3.4、re.sub

将文本中与模式匹配的部分替换为其他的内容
re.sub(pattern,repl,string,count,flags=0)

pattern:正则表达式的格式。

repl:这是替换文本或一个函数。如果是文本,就是将匹配到的内容替换为该文本; 如果是函数,会在函数中进行文本处理的操作。

string:被匹配的文本。

count: 这是可选参数,表示替换的最大次数。默认值为 0,表示替换所有 匹配项。

flags:标志位,用于控制正则表达式的匹配方式,如:是否区分大小写、 设置多行匹配模式等,具体有哪些标志可参考下面的附录1表格。
应用场景

文本格式化:将文本中的特定模式的文本替换为另一种格式。

数据清洗:在处理数据时,移除或替换无效或不需要的字符,比如在一系列文本 中删除非数字字符以清理电话号码。

敏感信息脱敏:在显示或存储数据前,将敏感信息(比如身份证号、手机号)的 部分内容替换为星号。

python 复制代码
import re


text = 'yeah, but no, but yeah, but no'
print(re.sub('but', 'AND', text))
# yeah, AND no, AND yeah, AND no

3.5、re.split

将某文本根据匹配模式进行分割,并将分割后的结果放入列表中返 回
re.split(pattern,string,maxsplit,flags=0)

pattern:正则表达式的格式。

string:被匹配的文本。

maxsplit:表示最大分割次数。默认值为 0,表示分割所 有匹配项。

flags:标志位,用于控制正则表达式的匹配方式

python 复制代码
import re
text = "apple, banana, orange, watermelon"
fruits = re.split(r',\s*', text)
print(fruits) #['apple', 'banana', 'orange', 'watermelon']

3.6、re.compile

预先编译正则表达式要匹配的模式,并会返回一个正则表达式的对象,该对 象与re.match返回的对象不同,该对象可以调用上面的函数。
re.compile(pattern, flags=0)

pattern:要匹配的正则表达式。

flags:标志位,用于控制正则表达式的匹配方式
常见的应用场景:

多次匹配:当你需要在一个较长的文本中多次应用同一个正则表达式时,使用 re.compile可以避免每次匹配时都重新编译表达式。

python 复制代码
import re
 # 编译一个正则表达式模式,用于匹配手机号
email_pattern = re.compile(r'[1]{1}[3589]{1}[0-9]{9}')
text = '''
 1o23j0 rde0
 13309876543
 cvbnoikdjgv
 10248895490-/*-+68-*8+
 '''
emails = email_pattern.search(text)
 
print(emails)
# <re.Match object; span=(15, 26), match='13309876543'>

四、思维导图

相关推荐
笨鸟先飞,勤能补拙3 小时前
AI 赋能网络安全:技术全景、成熟度评估与实战案例
人工智能·python·安全·web安全·网络安全·sqlite·github
长和信泰光伏储能4 小时前
京津冀光伏发电:绿色能源的未来之路
python·能源
浦信仿真大讲堂4 小时前
从重复操作到自动化闭环:如何让 CST 与 Python 真正协同起来
python·自动化·cst·仿真软件·达索软件
Gu Gu Study5 小时前
ScoutLoop开放域深度研究引擎(agent的初步设计想法)
人工智能·python
卷无止境5 小时前
写代码这件事,到底该讲究点什么?
后端·python
卷无止境6 小时前
循环复杂度到底在算什么,Python 代码怎么才能写得让人一看就懂
后端·python
lpfasd1236 小时前
MediaCrawler 项目深度分析
chrome·python·chrome devtools
Dxy12393102166 小时前
Python项目打包成EXE完整教程(PyInstaller实战避坑)
开发语言·python
bamb007 小时前
一个项目带你入门AI应用开发01
python
0566467 小时前
Python康复训练——常用标准库
开发语言·python·学习