一文秒懂python正则表达式常用函数

作者:原创时间:2022-05-16
文档

导读: 正则表达式是处理字符串类型的"核武器",不仅速度快,而且功能强大。本文不过多展开正则表达式相关语法,仅简要 介绍 python中正则表达式常用函数及其使用方 法,以作快速查询浏览。

01 Re概览

Re模块是python的内置模块,提供了正则表达式在python中的所有用法,默认安装位置在python根目录下的Lib文件夹(如 ..\Python\Python37\Lib)。主要提供了3大类字符串操作方法:

  • 字符查找/匹配

  • 字符替换

  • 字符分割

由于是面向字符串类型的模块,就不得不提到字符串编码类型。re模块中,模式串和搜索串既可以是 Unicode 字符串 (常用str类型) ,也可以是8位字节串 (bytes,2位16进制数字,例如\xe5) , 但要求二者必须是同类型字符串。

02 字符串查找/匹配

预编译:compile

在介绍查找和匹配函数前,首先需要知道re的compile函数,该函数可以将一个模式串编译成正则表达式类型,以便后续快速匹配和复用

import re
pattern = re.compile(r'[a-z]{2,5}')
type(pattern) #re.Pattern

此例创建了一个正则表达式式对象 (re.pattern) ,命名为pattern,用于匹配2-5位小写字母的模式串。后续在使用其他正则表达式函数时,即可使用pattern进行方法调用。

匹配:match

match函数用于从文本串的起始位置开始匹配,若匹配成功,则返回相应的匹配对象,此时可调用group()方法返回匹配结果,也可用span()方法返回匹配起止下标区间;否则返回None

import re
pattern = re.compile(r'[a-z]{2,5}')
text1 = 'this is a re test'
res = pattern.match(text1)
print(res) #
if res:
 print(res.group()) #this
 print(res.span()) #(0, 4)
text2 = '是的, this is a re test'
print(pattern.match(text2))#None

match函数还有一个变形函数fullmatch,当且仅当模式串与文本串刚好全部匹配时,返回一个匹配对象,否则返回None

搜索:search

match只提供了从文本串起始位置匹配的结果,如果想从任意位置匹配,则可调用search方法,与match方法类似,当任意位置匹配成功,则立即返回一个匹配对象,也可调用span()方法获取起止区间、调用group方法获得匹配文本串

import re
pattern = re.compile(r'\s[a-z]{2}')
text1 = 'this is a re test'
res = pattern.search(text1)
print(res) #
if res:
 print(res.group()) #is
 print(res.span()) #(4, 7)
pattern2 = re.compile(r'\s[a-z]{5}')
text2 = '是的,this is a re test'
print(pattern2.search(text2))#None

match和search均用于匹配单个结果,唯一区别在于前者是从起始位置开始匹配,而后者从任意位置匹配,匹配成功则返回一个match对象。

全搜索:findall/finditer

几乎是最常用的正则表达式函数,用于寻找所有匹配的结果,例如在爬虫信息提取中,可非常方便地提取所有匹配字段

import re
pattern = re.compile(r'\s[a-z]{2,5}')
text1 = 'this is a re test'
res = pattern.findall(text1)
print(res) #[' is', ' re', ' test']

findall返回的是一个列表对象类型,当无匹配对象时,返回一个空列表。为了避免因同时返回大量匹配结果占用过多内存,可以调用finditer函数返回一个迭代器类型,其中每个迭代元素是一个match对象,可继续调用group和span方法获取相应结果

import re
pattern = re.compile(r'\s[a-z]{2,5}')
text1 = 'this is a re test'
res = pattern.finditer(text1)
for r in res:
 print(r.group())
"""
 is
 re
 test
"""

当匹配模式串较为简单或者仅需单词调用时,上述所有方法也可直接调用re类函数,而无需事先编译。此时各方法的第一个参数为模式串。

import re
pattern = re.compile(r'\d{2,5}')
text = 'this is re test'
re.findall('[a-z]+', text) #['this', 'is', 're', 'test']

03 字符串替换/分割

替换:sub/subn

当需要对文本串进行条件替换时,可调用re.sub实现 (当然也可先编译后再用调用实例方法) ,相应参数分别为模式串、替换格式、文本串,还可以通过增加缺省参数限定替换次数和匹配模式。通过在模式串进行分组,可实现字符串的格式化替换(类似字符串的format方法),以实现特定任务。

import re
text = 'today is 2020-03-05'
print(re.sub('-', '', text)) #'today is 20200305'
print(re.sub('-', '', text, 1)) #'today is 202003-05'
print(re.sub('(\d{4})-(\d{2})-(\d{2})', r'\2/\3/\1', text)) #'today is 03/05/2020'

re.sub的一个变形方法是re.subn,区别是返回一个2元素的元组,其中第一个元素为替换结果,第二个为替换次数

import re
text = 'today is 2020-03-05'
print(re.subn('-', '', text)) #('today is 20200305', 2)

分割:split

还可以调用正则表达式实现字符串的特定分割,相当于.split()方法的一个加强版,实现特定模式的分割,返回一个切割后的结果列表

import re
text = 'today is a re test, what do you mind?'
print(re.split(',', text)) #['today is a re test', ' what do you mind?']

04 总结

python中的re模块提供了正则表达式的常用方法,每种方法都包括类方法调用(如re.match)或模式串的实例调用(pattern.match)2种形式

  • 常用的匹配函数:match/fullmatch

  • 常用的搜索函数:search/findall/finditer

  • 常用的替换函数:sub/subn

  • 常用的切割函数:split

  • 还有其他很多方法,但不是很常用,具体可参考官方文档

  • 另外,python还有第三方正则表达式库regex可供选择

到此这篇关于一文秒懂python正则表达式常用函数的文章就介绍到这了,希望大家以后多多支持好二三四!

显示全文
python正则表达式语法学习笔记 带动物的诗句 如何关闭360画报 叮咚怎么抢菜 网易云一起听怎么添加歌 adobe creative cloud是什么软件 24岁是什么年华 季度怎么划分 什么是防范区 大怨种是个啥 七月初七有哪些风俗 参照密接是什么意思 媚宅是什么 咏雪的诗句 传统节日的诗句 描写植物的诗句 描写山的诗句有哪些 梅兰竹菊的诗句 与莲有关的诗句 赞美虎的诗句 Python常用的正则表达式处理函数详解 JS截取字符串的三种方法详解 PHP遍历数组的6种方式总结 php两种基本的输出方及实例详解 php生成唯一uid的解决方法详解 PHP7中对十六进制字符串处理的问题详解 PHP对接抖音开发平台接口的详细教程 php7安装mysqli实例讲解 php去掉一维数组的键值的实例方法 PHP中empty()和isset()的区别介绍 PHP实现JWT的Token登录认证 php判断时间戳是否为今天实例讲解 PHP7 preg_replace出错及解决办法 关于杏花的诗句 带飞的诗句 形容女人漂亮的诗句 春花的诗句 描写初春的诗句 描写燕子的诗句 带有春字的诗句