在处理字符串时,经常会有查找符合某些复杂规则的字符串的需求。正则表达式就是用于描述这些规则的工具。换句话说,正则表达式就是记录文本规则的代码。
Python 提供了 re 模块用于实现正则表达式的操作。在实现时,可以使用 re 模块提供的方法,如search()、match()、findall() 等,进行字符串处理,也可以先使用 re 模块的 compile() 方法将模式字符串转换为正则表达式对象,然后再使用该正则表达式对象的相关方法来操作字符串。re 模块在使用时,需要先用 import 语句引入,具体代码如下:
在正则表达式中,提供了一个通配符——英文状态下输入的“.”,用于匹配除“ ”和“ ”以外的任意单个字符。如果想要使用“.”匹配“ ”换行符,则需要指定 flags=re.DOTALL。例如,“.”可以匹配 mr M R 中的 m、r、M、 、R。
正则表达式中提供了管道符,即“或”操作符,用于匹配两个或者多个正则表达式中的一个。例如,A|B,其中 A 和 B 都是正则表达式,在匹配时,从左到右进行匹配,当一个样式完全匹配时,另一个就不再匹配。即如果 A 匹配成功,则 B 就不再匹配。
子模式也就是分组的意思,使用小括号可以对正则表达式进行分组。如 (.[0-9]{1,3}){3},就是对分组 (.[0-9]{1,3}) 进行重复操作。
另外,小括号字符也可以改变限定符的作用范围,如“|”“*”“^”等。来看下面的一个表达式:
这个表达式的意思是匹配单词 thirth 或 fourth,如果不使用小括号,那么就变成了匹配单词 thir或 fourth 了。
正则表达式中的转义字符()和 Python 中的大同小异,都是将特殊字符(如“.”“?”“”等)变为普通字符。举一个 IP 地址的实例,用正则表达式匹配诸如 127.0.0.1 这样格式的 IP 地址,如果直接使用点字符,格式为:
这显然不对,因为“.”可以匹配一个任意字符。这时,不仅是 127.0.0.1 这样的 IP,连127101011 这样的字符串也会被匹配出来。所以在使用“.”时,需要使用转义字符()。修改后上面的正则表达式格式为:
在使用 re 模块提供的方法时,经常需要指定一个 flags 参数,该参数为标志修饰符,是一个可选参数。通过它可以指定是否区分字母大小写、多行匹配等。
compile() 方法用于编译正则表达式模式,返回一个对象的模式。然后可以通过 RegexObject 对象调用 match() 和 search() 方法。语法格式如下:
参数说明:
-
pattern :编译时用的表达式字符串。
-
flags :编译标志位,用于修改正则表达式的匹配方式,如是否区分大小写、多行匹配等。
-
返回值:返回一个正则表达式对象。
使用 compile() 方法创建一个可以查找包含指定字母对应单词的正则表达式对象,并输出符合条件的英文单词,代码如下:
escape() 方法用于对字符串中的非字母数字进行转义。语法格式如下:
参数说明:
-
pattern :表示模式字符串,由要匹配的正则表达式转换而来。
-
返回值:返回转义后的字符串。
使用 escape() 方法实现对字符串中的非字母数字进行转义,代码如下:
程序运行结果如下:
findall() 方法用于在整个字符串中搜索所有符合正则表达式的字符串,并以列表的形式返回。如果匹配成功,则返回包含匹配结构的列表,否则返回空列表。语法格式如下:
参数说明:
-
pattern :表示模式字符串,由要匹配的正则表达式转换而来。decimal
-
string :表示要匹配的字符串。
-
flags :可选参数,表示标志位,用于控制匹配方式,如是否区分字母大小写。
-
返回值:返回一个符合表达式匹配结果的列表。
使用 findall() 方法搜索以“mr_”开头的字符串,代码如下:
finditer() 方法和 findall() 方法类似,它的功能为在字符串中找到正则表达式所匹配的所有子串,但是把它们作为一个迭代器返回。语法格式如下:
参数说明:
-
pattern :表示匹配的正则表达式。
-
string :表示要匹配的字符串。
-
flags :表示标志位,用户控制正则表达式的匹配方式,如是否区分大小写、多行匹配等。
-
返回值:返回一个符合表达式匹配结果的迭代器。
使用 finditer() 方法获取字符串中的所有数值,代码如下:
fullmatch() 方法用于对整个字符串进行匹配,如果整个字符串匹配到正则表达式样式,就返回一个相应的匹配对象,否则就返回一个 None。语法格式如下:
参数说明:
-
pattern :表示模式字符串,由要匹配的正则表达式转换而来。
-
string :表示要匹配的字符串。
-
flags :可选参数,表示标志位,用于控制匹配方式,如是否区分字母大小写。
-
返回值:如果整个 string 匹配到正则表达式样式,就返回一个相应的 Match 对象。
使用 fullmatch() 方法实现匹配整个字符串,代码如下:
程序运行结果如下:
match() 方法用于从字符串的开始处进行匹配,如果在起始位置匹配成功,则返回 Match 对象,否则返回 None。语法格式如下:
参数说明:
-
pattern :表示模式字符串,由要匹配的正则表达式转换而来。
-
string :表示要匹配的字符串。
-
flags :可选参数,表示标志位,用于控制匹配方式,如是否区分字母大小写。
-
返回值:如果 string 的开始处有 0 或多个字符匹配到了正则表达式样式,就返回一个相应的 Match 对象。
使用 match() 方法判断匹配字符串是否以“mr_”开头,不区分字母大小写,代码如下:
程序运行结果如下:
search() 方法用于在整个字符串中搜索第一个匹配的值,如果匹配成功,则返回 Match 对象,否则返回 None。语法格式如下:
参数说明:
-
pattern :表示模式字符串,由要匹配的正则表达式转换而来。
-
string :表示要匹配的字符串。
-
flags :可选参数,表示标志位,用于控制匹配方式,如是否区分字母大小写。
-
返回值:扫描整个字符串找到匹配样式的第一个位置,并返回一个相应的匹配对象。如果没有匹配,就返回一个 None。注意,这和找到一个零长度匹配是不同的。
使用 search() 方法搜索第一个以“mr_”开头的字符串,不区分字母大小写,代码如下:
程序运行结果如下:
split() 方法用于实现根据正则表达式分割字符串,并以列表的形式返回。其作用同字符串对象的 split() 方法类似,所不同的就是分割字符由模式字符串指定。语法格式如下:
参数说明:
-
pattern :表示模式字符串,由要匹配的正则表达式转换而来。
-
string :表示要匹配的字符串。
-
maxsplit :可选参数,表示最大的拆分次数。
-
flags :可选参数,表示标志位,用于控制匹配方式,如是否区分字母大小写。
-
返回值:返回一个分割后的字符串列表。
使用split()方法实现从给定的 URL 地址中提取出请求地址和各个参数的功能,代码如下:
程序运行结果如下:
sub() 方法用于实现字符串替换。语法格式如下:
参数说明:
-
pattern :表示模式字符串,由要匹配的正则表达式转换而来。
-
repl :表示替换的字符串。
-
string :表示要被查找替换的原始字符串。
-
count :可选参数,表示模式匹配后替换的最大次数,默认值为 0,表示替换所有的匹配。
-
flags :可选参数,表示标志位,用于控制匹配方式,如是否区分字母大小写。
-
返回值:返回替换后的字符串。
使用 sub() 方法实现隐藏中奖信息中的手机号码的功能,代码如下:
程序运行结果如下:
使用 sub() 方法排除字符串中的汉字、字母与数字,代码如下:
程序运行结果如下:
subn() 方法与 sub() 方法相同,都是用于实现字符串的替换。但 subn() 方法返回一个元组,其中包含新字符串和替换次数。语法格式如下:
参数说明:
-
pattern :表示模式字符串,由要匹配的正则表达式转换而来。
-
repl :表示替换的字符串。
-
string :表示要被查找替换的原始字符串。
-
count :可选参数,表示模式匹配后替换的最大次数,默认值为 0,表示替换所有的匹配。
-
flags :可选参数,表示标志位,用于控制匹配方式,如是否区分字母大小写。
-
返回值:返回一个包含替换后字符串与替换次数的元组。
使用 subn() 方法实现替换字符串中的指定内容的功能,代码如下:
Pattern.flags 属性用于获取正则表达式中匹配模式对应的标记。语法格式如下:
使用 Pattern.flags 属性获取常见匹配模式对应的标记,代码如下:
Pattern.groups 属性用于获取正则表达式中组合的数量。语法格式如下:
使用 Pattern.groups 属性获取正则表达式中组合的数量,代码如下:
Pattern.groupindex 属性用于获取正则表达式中分组名称与对应的分组编号。语法格式如下:
使用 Pattern.groupindex 属性获取表达式中分组名称与对应的分组编号,代码如下:
程序运行结果如下:
Pattern.pattern 属性用于获取正则表达式中的模式字符串。语法格式如下:
使用 Pattern.pattern 属性获取表达式中的模式字符串,代码如下:
程序运行结果如下:
Pattern.findall() 方法用于在整个字符串中搜索所有符合正则表达式的字符串,并以列表的形式返回。如果匹配成功,则返回包含匹配结构的列表,否则返回空列表。该方法可以指定匹配字符串的范围。语法格式如下:
参数说明:
-
string :表示需要匹配的字符串。
-
pos :表示匹配的起始位置,该参数为可选参数,默认值为 0。
-
endpos :表示匹配的结束位置,该参数为可选参数,默认为需要匹配字符串的长度,所以只有从 pos 到 endpos-1 的字符会被匹配。
-
返回值:返回一个符合表达式匹配结果的列表。
使用 Pattern.findall() 方法搜索字符串中以“mr_”开头的字符串,代码如下:
程序运行结果如下:
Pattern.finditer() 方法用于在字符串中找到正则表达式所匹配的所有子串,把它们作为一个迭代器返回。该方法可以指定匹配字符串的范围。语法格式如下:
参数说明:
-
string :表示需要匹配的字符串。
-
pos :表示匹配的起始位置,该参数为可选参数,默认值为 0。
-
endpos :表示匹配的结束位置,该参数为可选参数,默认为需要匹配字符串的长度,所以只有从 pos 到 endpos-1 的字符会被匹配。
-
返回值:返回一个符合表达式匹配结果的迭代器。
使用 Pattern.finditer() 方法获取字符串中指定范围的所有数字,代码如下:
Pattern.fullmatch() 方法用于对整个字符串匹配。从 pos 下标位置开始逐个对字符串进行匹配直到 endpos 下标位置,如果匹配成功则返回匹配成功的 Match 对象;如果没有匹配成功,就返回None。语法格式如下:
参数说明:
-
string :表示需要匹配的字符串。
-
pos :表示匹配的起始位置,该参数为可选参数,默认值为 0。
-
endpos :表示匹配的结束位置,该参数为可选参数,默认为需要匹配字符串的长度,所以只有从 pos 到 endpos-1 的字符会被匹配。
-
返回值:如果整个 string 匹配到正则表达式样式,就返回一个相应的 Match 对象。
使用 Pattern.fullmatch() 方法获取字符串中开始处符合表达式的值,代码如下:
程序运行结果如下:
Pattern.match() 方法用于从字符开始处匹配字符串的值,从 pos 下标位置开始逐个对字符串进行匹配直到 endpos 下标位置,如果匹配成功则返回匹配成功的 Match 对象;如果没有匹配成功,就返回 None。语法格式如下:
参数说明:
-
string :表示需要匹配的字符串。
-
pos :表示匹配的起始位置,该参数为可选参数,默认值为 0。
-
endpos :表示匹配的结束位置,该参数为可选参数,默认为需要匹配字符串的长度,所以只有从 pos 到 endpos-1 的字符会被匹配。
-
返回值:如果 string 开始的位置可以匹配到正则表达式样式,就返回一个相应的 Match 对象。
使用 Pattern.match() 方法获取字符串中开始处符合表达式的值,代码如下:
程序运行结果如下:
Pattern.search() 方法用于搜索第一个匹配的位置,从 pos 下标位置开始逐个对字符串进行匹配直到 endpos 下标位置,如果匹配成功,则返回匹配成功的 Match 对象,否则返回 None。语法格式如下:
参数说明:
-
string :表示需要匹配的字符串。
-
pos :表示匹配的起始位置,该参数为可选参数,默认值为 0。
-
endpos :表示匹配的结束位置,该参数为可选参数,默认为需要匹配字符串的长度,所以只有从 pos 到 endpos-1 的字符会被匹配。
-
返回值:扫描整个字符串找到匹配样式的第一个位置,并返回一个相应的匹配对象。
使用 Pattern.search() 方法获取字符串中第一个匹配值与位置,代码如下:
程序运行结果如下:
Pattern.split() 方法与 re.split() 方法相同,用于实现根据正则表达式分割字符串,并以列表的形式返回。其作用同字符串对象的 split() 方法类似,所不同的是分割字符由模式字符串指定。语法格式如下:
参数说明:
-
string :表示需要匹配的字符串。
-
maxsplit :可选参数,表示最大的拆分次数。
-
返回值:返回一个分割后的字符串列表。
使用 Pattern.split() 方法实现从给定的 URL 地址中提取出请求地址和各个参数,代码如下:
Pattern.sub() 方法与 re.sub() 方法相同,用于实现字符串替换。语法格式如下:
参数说明:
-
repl :表示替换的字符串。
-
string :表示要被查找替换的原始字符串。
-
count :可选参数,表示模式匹配后替换的最大次数,默认值为 0,表示替换所有的匹配。
-
返回值:返回替换后的字符串。
使用 Pattern.sub() 方法实现隐藏中奖信息中的手机号码的功能,代码如下:
Pattern.subn() 方法与 re.subn() 方法相同,都是用于实现字符串的替换并返回一个元组,其中包含新字符串和替换次数。语法格式如下:
参数说明:
-
repl :表示替换的字符串。
-
string :表示要被查找替换的原始字符串。
-
count :可选参数,表示模式匹配后替换的最大次数,默认值为 0,表示替换所有的匹配。
-
返回值:返回一个包含替换后字符串与替换次数的元组。
使用 Pattern.subn() 方法实现替换字符串中的指定内容的功能,代码如下:
Match.endpos 属性用于获取正则表达式在字符串结束匹配的索引位置。语法格式如下:
使用 Match.endpos 属性获取正则表达式在字符串结束匹配的索引位置,代码如下:
程序运行结果如下:
Match.pos 属性用于获取正则表达式在字符串开始匹配的索引位置。语法格式如下:
使用 Match.pos 属性获取正则表达式在字符串开始匹配的索引位置,代码如下:
程序运行结果如下:
Match.lastindex 属性用于捕获组的最后一个匹配的索引值。语法格式如下:
使用 Match.lastindex 属性获取最后一个匹配到的组所对应的索引值,代码如下:
Match.lastgroup 属性用于获取最后一个匹配组的名称,如果匹配的组没有名字或者没有产生匹配的情况下,则返回 None。语法格式如下:
使用 Match.lastgroup 属性获取最后一个匹配组的名称,代码如下:decimal
Match.re 属性用于获取产生 Match 实例的正则表达式对象。语法格式如下:
使用 Match.re 属性获取产生 Match 实例的正则表达式对象,代码如下:
程序运行结果如下:
Match.string 属性用于获取 Match 对象中需要匹配的字符串。语法格式如下:
使用 Match.string 属性获取 Match 对象中需要匹配的字符串,代码如下:
Match.__getitem__() 方法与 Match.group() 方法相似,只是 __getitem__() 方法每次只能获取一个分组的信息。语法格式如下:
参数说明:
-
g :表示分组对应的编号或分组名称。
-
返回值:返回一个匹配的分组信息。
使用 Match.getitem() 方法获取指定分组对应的信息,代码如下:
Match.end() 方法用于获取分组匹配字符串对应的结束标记。语法格式如下:
参数说明:
-
group :表示分组名或者分组名对应的编号。
-
返回值:返回分组匹配字符串对应的结束标记。
使用 Match.start() 方法与 Match.end() 方法获取分组匹配字符串对应的开始、结束标记,代码如下:
Match.expand() 方法用于实现把字符串中用反斜杠“”表示的数字或组名替换为相应分组中的值的功能。语法格式如下:
参数说明:
-
template :表示需要替换的字符串。
-
返回值:返回对“”进行转义替换的结果。
使用 Match.expand() 方法,在字符串中指定位置替换对应分组中的值,代码如下:
Match.groups() 方法用于获取以元组形式返回所有子组中内容。语法格式如下:
参数说明:
-
default :用于不参与匹配的情况,默认为 None。
-
返回值:以元组形式返回所有子组中内容。
使用 Match.groups() 方法获取所有分组对应的内容,代码如下:
Match.group() 方法用于获取 Match 对象中一个或多个匹配的子组。如果只有一个(0~99)参数,结果就是一个字符串;如果有多个参数,结果就是一个元组(每个参数对应一个项);如果没有参数,组 1 默认到 0(整个匹配都被返回)。如果一个组 N 参数值为 0,相应的返回值就是整个匹配字符串;如果一个组号是负数或超出组的最大长度,则给出越界错误;如果正则表达式中的一个组匹配了多个值,则相应的组只保存最后匹配的值。语法格式如下:
参数说明:
-
group1 :表示分组对应的编号或分组名称。
-
返回值:返回一个或者多个匹配的子组。
使用 Match.group() 方法获取指定分组对应的信息,代码如下:
Match.groupdict()方法用于获取以字典形式返回包含所有匹配值分组的信息,其中key就是组名,value 就是分组匹配的信息内容。语法格式如下:
参数说明:
-
default :用于不参与匹配的情况,默认为 None。
-
返回值:以字典形式返回包含所有匹配值分组的信息。
使用 Match.groupdict() 方法获取字典形式的分组信息,代码如下:
Match.span() 方法用于获取指定分组匹配字符串的开始和结束位置。语法格式如下:
参数说明:
-
group :表示分组名或者分组名对应的编号。
-
返回值:返回一个包含开始和结束位置的二元组。
使用 Match.span() 方法获取指定分组匹配字符串的开始和结束位置,代码如下:
Match.start() 方法用于获取分组匹配字符串对应的开始标记。语法格式如下:
参数说明:
-
group :表示分组名或者分组名对应的编号。
-
返回值:返回分组匹配字符串对应的开始标记。
使用 Match.start() 方法与 Match.end() 方法获取分组匹配字符串对应的开始、结束标记,代码如下: