想必字符串大家肯定都知道吧?在 Python 里我们常常需要对字符串进行操作,而在字符串对象本身就有许多内置的方法,大多数只需要对字符串简单处理的情况下,这些方法就已经足够了,比如 split 、 join 、 strip 、 lstrip 、 rstrip 和 replace 等等。然鹅,这些都只是对字符串处理的普通操作,真正强大的高级操作是 正则表达式 !又正好,Python有一个内置的正则表达式模块,它就是 re 模块 !
【个人建议:想要灵活掌握re模块,建议在稍稍了解正则表达式语法的基础上(不必完全记住,因为一开始不好理解),再学习 re 模块的函数及类。在看re模块的代码示例时遇到不懂的语法规则,可以再回头看看正则表达式的语法,这样方便理解和掌握】
正则表达式
正则表达式,又称规则表达式,(Regular Expression,在代码中常简写为regex、regexp或RE),是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为"元字符"),是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串,通常被用来检索、替换那些符合某个模式(规则)的文本。
匹配模式(pattern)—— 元字符
【注:下面的 RE(Regular Expression) 表示某个具体的正则表达式】
可选标志(flags)—— 修饰符
正则表达式可以包含一些可选标志修饰符来控制匹配的模式。修饰符被指定为一个可选的标志,可有可无,多个标志可以通过按位或的符号(“|”) 来指定(如:re.M|re.X )。修饰符本身只是一个大写字母而已,但我们在Python里平时引入re模块时习惯用 import re,所以下面的修饰符在用的时候记得在其前面加上 re. 哦!
re模块
Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式。re 模块使 Python 语言拥有全部的正则表达式功能。compile 函数根据一个模式字符串和可选的标志参数生成一个正则表达式对象。该对象拥有一系列方法用于正则表达式匹配和替换。re 模块也提供了与这些方法功能完全一致的函数,这些函数使用一个模式字符串做为它们的第一个参数
re模块的类
【error类】
error(msg: str, pattern: str | bytes | None = ..., pos: int | None = ...)
re 模块所有异常的公共基类,一般用不到
【Match类】
匹配类,相当于匹配结果
【方法 group】无参数时返回匹配的字符串,若有参数,返回名为参数的分组的字符串
【方法 groups】无参数,返回一个包含所有分组字符串的元组
【方法 groupdict】无参数,类似于方法 groups,但返回一个字典
【方法 start】用于获取分组匹配的子串在整个字符串中的起始位置(子串第一个字符的索引),参数默认值为 0
【方法 end】用于获取分组匹配的子串在整个字符串中的结束位置(子串最后一个字符的索引+1),参数默认值为 0
【方法 span】返回匹配开始与结束位置索引的元组(start(group), end(group)),参数为 group,用法类似于上面
【方法 expand】有一个 template 参数,接收字符串类型,返回一个字符串【具体啥用我也不清楚】
【Pattern类】
匹配模式类,相当于匹配规则,Pattern 类拥有很多类似于后面要讲到的函数的方法,但与下面的函数相比,它们又有区别
方法 findall
findall(string: str, pos: int = ..., endpos: int = ...)
与 findall 函数相比,findall 方法没有 pattern 参数和 flags 参数(这俩参数由 compile 函数指定),pos 参数指定字符串的起始位置,默认为 0,endpos 参数指定字符串的结束位置,默认为字符串的长度,返回值一样,是个列表
方法 finditer
finditer(string: str, pos: int = ..., endpos: int = ...)
参数描述与上面的 findall 方法类似,返回值和 finditer 函数的一样
方法 fullmatch
fullmatch(string: str, pos: int = ..., endpos: int = ...)
参数描述与上面的 findall 方法类似,返回值和 fullmatch 函数的一样
方法 match
match(string: str, pos: int = ..., endpos: int = ...)
参数描述与上面的 findall 方法类似,返回值和 match 函数的一样
方法 search
search(string: str, pos: int = ..., endpos: int = ...)
参数描述与上面的 findall 方法类似,返回值和 search 函数的一样
方法 split
split(string: str, maxsplit: int = ...)
没有 pattern 参数和 flags 参数,其余参数与返回值和 split 函数的一样
方法 sub
sub(repl: str | (Match[str]), string: str, count: int = ...)
没有 pattern 参数和 flags 参数,其余参数与返回值和 sub 函数的一样
方法 sub
sub(repl: str | (Match[str]), string: str, count: int = ...)
没有 pattern 参数和 flags 参数,其余参数与返回值和 sub 函数的一样
【RegexFlag类】
正则表达式修饰符类,可选标志参数,包括 A(ASCII)、I(IGNORECASE)、L(LOCALE)、M(MULTILINE)、S(DOTALL)、U(UNICODE)、X(VERBOSE)、T(TEMPLAT)和 DEBUG 等
re模块的函数
【compile函数】
函数语法
compile(pattern: AnyStr@compile, flags: _FlagsType = ...)
【参数 pattern】一个正则表达式字符串
【参数 flags】可选标志,修饰符,默认不进行修饰
编译正则表达式函数,将正则表达式字符串编译为 Pattern 对象(Pattern[AnyStr@compile]),方便使用该正则表达式
代码示例
import re #正则表达式含义:匹配单个非数字的字符 pattern_1 = re.compile(r'[^\d]') #正则表达式含义:匹配单个数字字符或者单个小写字母字符 pattern_2 = re.compile(r'[0-9a-z]') print(pattern_1.match('abc123').group()) #输出:a print(pattern_2.search('ABCdef123').group()) #输出:d print(pattern_1) #输出:re.compile('[^\\d]')
【escape函数】
函数语法
escape(pattern: AnyStr@escape)
【参数 pattern】一个正则表达式字符串
函数对字符串中的转义字符进行还原,返回还原后的字符串
代码示例
import re ''' 此处不可直接用print输出,print会将还原后的字符又转义过去 用__repr__方法转换为原本的字符串后输出 不了解字符串类__repr__方法的应先去了解一下 ''' print(re.escape('Python.png').__repr__()) #输出:'Python\\.png' print(re.escape('Python\Good').__repr__()) #输出:'Python\\\\png' print(r'Python\Good'.__repr__())#见后面【转义与还原】部分了解更多 #输出:'Python\\Good'
【findall函数】
函数语法
findall(pattern: str | Pattern[str], string: str, flags: _FlagsType = ...)
【参数 pattern】正则表达式字符串或者Pattern类
【参数 string】要匹配的字符串
【参数 flags】可选标志,修饰符,默认不进行修饰
在 string 中寻找所有满足正则表达式的匹配结果,并将它们以列表形式返回,若没有满足条件的匹配结果,则返回空列表
代码示例
import re #正则表达式含义:匹配两个连续的数字字符 outlist = re.findall('\d{2}','a12b34c56def780') print(outlist) #输出:['12', '34', '56', '78']
【finditer函数】
函数语法
finditer(pattern: str | Pattern[str], string: str, flags: _FlagsType = ...)
【参数 pattern】正则表达式字符串或者Pattern类
【参数 string】要匹配的字符串
【参数 flags】可选标志,修饰符,默认不进行修饰
和 findall 函数(见上)类似,唯一的区别是 finditer 函数返回的不是列表,而是一个迭代器(Iterator[Match[str]])
代码示例
import re #正则表达式含义:匹配两个连续的数字字符 outiter = re.finditer('\d{2}','a12b34c56def780') for i in outiter: print(i.group()) ''' 输出: 12 34 56 78 '''
【fullmatch函数】
函数语法
fullmatch(pattern: str | Pattern[str], string: str, flags: _FlagsType = ...)
【参数 pattern】正则表达式字符串或者Pattern类
【参数 string】要匹配的字符串
【参数 flags】可选标志,修饰符,默认不进行修饰
与 match 函数类似,但它是完全匹配,即string必须从头到尾都满足 pattern 的模式,若满足则返回匹配结果(Match[str] 对象),否则返回 None
代码示例
import re #正则表达式含义:匹配六个连续的非数字字符 Match_Object_1 = re.fullmatch('\D{6}','Python') #正则表达式含义:匹配六个连续的单词字符 Match_Object_2 = re.fullmatch('\w{6}','JavaScript') print(Match_Object_1.group()) #输出:Python print(Match_Object_2.group())#没有完全匹配 #输出:AttributeError: 'NoneType' object has no attribute 'group'
【match函数】
函数语法
match(pattern: str | Pattern[str], string: str, flags: _FlagsType = ...)
【参数 pattern】正则表达式字符串或者Pattern类
【参数 string】要匹配的字符串
【参数 flags】可选标志,修饰符,默认不进行修饰
函数直接对 string 的开头进行匹配,匹配成功就返回匹配结果(Match[str] 对象),否则返回 None
代码示例
import re #正则表达式含义:匹配六个连续的非数字字符 Match_Object_1 = re.match('\D{6}','Python') #正则表达式含义:匹配六个连续的单词字符 Match_Object_2 = re.match('\w{6}','JavaScript') print(Match_Object_1.group()) #输出:Python print(Match_Object_2.group()) #输出:JavaSc
【purge函数】
函数语法
purge()
没有参数
清除正则表达式缓存,re 模块函数会对已编译的正则表达式对象进行缓存,在不同的 Python 版本中,缓存中已编译过的正则表达式对象的数目可能不同,而且没有文档记录,而 purge 函数能够用于清除这些缓代码示例
1. import re 2. 3. #清除缓存 4. re.purge()#具体啥效果我也不太清楚...
【search函数】
函数语法
search(pattern: str | Pattern[str], string: str, flags: _FlagsType = ...)
【参数 pattern】正则表达式字符串或者Pattern类
【参数 string】要匹配的字符串
【参数 flags】可选标志,修饰符,默认不进行修饰
函数会从起始字符搜索整个 string,返回第一个满足正则表达式的匹配结果(Match[str] 对象),否则返回 None
代码示例
import re #正则表达式含义:匹配3个连续的小写字母字符 #修饰符:I(IGNORECASE)忽略大小写,对大小写一视同仁 Match_Object_1 = re.search('[a-z]{3}','123_Oh_My_God_456',re.I) #正则表达式含义:匹配字符串模式:_零个或多个连续单词字符_ Match_Object_2 = re.search('_\w*_','I_love_Python!') print(Match_Object_1.group()) #输出:God print(Match_Object_2.group()) #输出:_love_
【split函数】
函数语法
split(pattern: str | Pattern[str], string: str, maxsplit: int = ..., flags: _FlagsType = ...)
【参数 pattern】正则表达式字符串或者Pattern类
【参数 string】要匹配的字符串
【参数 maxsplit】最大分割次数,从左往右计数,默认为对象ellipsis,即完全分割
【参数 flags】可选标志,修饰符,默认不进行修饰
与字符串的 split 方法类似,返回分割后的字符串,但分割规则由正则表达式决定,不了解字符串对象 split 方法的应先去了解该方法
代码示例
import re #正则表达式含义:匹配任意个连续的数字字符 #最大分割次数为3(切4刀,产生5份) outlist_1 = re.split('\d*','a1b22c333d4444e',4) #正则表达式含义:匹配一个或多个连续的数字字符 #最大分割次数为3(切3刀,产生4份) outlist_2 = re.split('\d+','a1b22c333d4444e',3) print(outlist_1) #输出:['', 'a', '', 'b', 'c333d4444e'] print(outlist_2) #输出:['a', 'b', 'c', 'd4444e']