1. re模块介绍
正则表达式
在处理字符串时,经常会有查找符合某些复杂规则的字符串的需求。正则表达式就是用于描述这些规则的工具。换句话说,正则表达式就是记录文本规则的代码。
re 模块
Python 提供了 re 模块用于实现正则表达式的操作。在实现时,可以使用 re 模块提供的方法,如search()、match()、findall() 等,进行字符串处理,也可以先使用 re 模块的 compile() 方法将模式字符串转换为正则表达式对象,然后再使用该正则表达式对象的相关方法来操作字符串。re 模块在使用时,需要先用 import 语句引入,具体代码如下:
import re
2. 定位符,描述字符的边界
3. 预定义字符集,标准字符转义序列
4. 通配符,匹配非预定义字符集合
在正则表达式中,提供了一个通配符——英文状态下输入的“.”,用于匹配除“\r”和“\n”以外的任意单个字符。如果想要使用“.”匹配“\n”换行符,则需要指定 flags=re.DOTALL。例如,“.”可以匹配 mr\nM\tR 中的 m、r、M、\t、R。
5. 非预定义字符集,匹配非预定义字符集合
6. 限定符,限定匹配次数
7. 管道符,“或”操作
正则表达式中提供了管道符,即“或”操作符,用于匹配两个或者多个正则表达式中的一个。例如,A|B,其中 A 和 B 都是正则表达式,在匹配时,从左到右进行匹配,当一个样式完全匹配时,另一个就不再匹配。即如果 A 匹配成功,则 B 就不再匹配。
8. 子模式,分组
子模式也就是分组的意思,使用小括号可以对正则表达式进行分组。如 (.[0-9]{1,3}){3},就是对分组 (.[0-9]{1,3}) 进行重复操作。
另外,小括号字符也可以改变限定符的作用范围,如“|”“*”“^”等。来看下面的一个表达式:
(thir|four)th
这个表达式的意思是匹配单词 thirth 或 fourth,如果不使用小括号,那么就变成了匹配单词 thir或 fourth 了。
9. 转义字符,将特殊字符变为普通字符
正则表达式中的转义字符(\)和 Python 中的大同小异,都是将特殊字符(如“.”“?”“\”等)变为普通字符。举一个 IP 地址的实例,用正则表达式匹配诸如 127.0.0.1 这样格式的 IP 地址,如果直接使用点字符,格式为:
[1-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}
这显然不对,因为“.”可以匹配一个任意字符。这时,不仅是 127.0.0.1 这样的 IP,连127101011 这样的字符串也会被匹配出来。所以在使用“.”时,需要使用转义字符(\)。修改后上面的正则表达式格式为:
[1-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}
10. 可选标志修饰符,控制匹配方式
在使用 re 模块提供的方法时,经常需要指定一个 flags 参数,该参数为标志修饰符,是一个可选参数。通过它可以指定是否区分字母大小写、多行匹配等。
11. compile()方法,编译为正则表达式对象
语法参考
compile() 方法用于编译正则表达式模式,返回一个对象的模式。然后可以通过 RegexObject 对象调用 match() 和 search() 方法。语法格式如下:
re.compile(pattern,flags=0)
参数说明:
-
pattern :编译时用的表达式字符串。
-
flags :编译标志位,用于修改正则表达式的匹配方式,如是否区分大小写、多行匹配等。
-
返回值:返回一个正则表达式对象。
锦囊1 查找包含指定字母的单词
使用 compile() 方法创建一个可以查找包含指定字母对应单词的正则表达式对象,并输出符合条件的英文单词,代码如下:
import re # 导入正则表达式re模块
# 需要匹配的字符串
string = “Tina is a good girl, she is cool, clever, and so on...”
match = re.compile(r’\w*oo\w*’) # 创建正则表达式对象
print(match.findall(string )) # 打印所有包含“oo”的单词
12. escape()方法,转义特殊字符
语法参考
escape() 方法用于对字符串中的非字母数字进行转义。语法格式如下:
re.escape(pattern)
参数说明:
-
pattern :表示模式字符串,由要匹配的正则表达式转换而来。
-
返回值:返回转义后的字符串。
锦囊1 对字符串中的非字母数字进行转义
使用 escape() 方法实现对字符串中的非字母数字进行转义,代码如下:
import re # 导入正则表达式re模块
# 需要转义的字符串
string = ‘abcdefghijklmnopqrstuvwxyz0123456789!#$%&*+-.^_`|~’
print(re.escape(string)) # 打印转义后的字符串
程序运行结果如下:
abcdefghijklmnopqrstuvwxyz0123456789!\#\$%\&\*\+\-\.\^_`\|\~
13. f indall()方法,搜索所有符合正则表达式的字符串
语法参考
findall() 方法用于在整个字符串中搜索所有符合正则表达式的字符串,并以列表的形式返回。如果匹配成功,则返回包含匹配结构的列表,否则返回空列表。语法格式如下:
re.findall(pattern, string, flags=0)
参数说明:
-
pattern :表示模式字符串,由要匹配的正则表达式转换而来。decimal
-
string :表示要匹配的字符串。
-
flags :可选参数,表示标志位,用于控制匹配方式,如是否区分字母大小写。
-
返回值:返回一个符合表达式匹配结果的列表。
锦囊1 搜索以“mr_”开头的字符串
使用 findall() 方法搜索以“mr_”开头的字符串,代码如下:
import re # 导入正则表达式re模块
pattern = r’mr_\w+’ # 模式字符串
string = ‘MR_SHOP mr_shop’ # 要匹配的字符串
match = re.findall(pattern,string,re.I) # 搜索字符串,不区分大小写
print(match) # 打印匹配结果
string = ‘项目名称MR_SHOP mr_shop’
match = re.findall(pattern,string) # 搜索字符串,区分大小写
print(match) # 打印匹配结果
14. f inditer()方法,找到所匹配的所有子串
语法参考
finditer() 方法和 findall() 方法类似,它的功能为在字符串中找到正则表达式所匹配的所有子串,但是把它们作为一个迭代器返回。语法格式如下:
re.finditer(pattern, string, flags=0)
参数说明:
-
pattern :表示匹配的正则表达式。
-
string :表示要匹配的字符串。
-
flags :表示标志位,用户控制正则表达式的匹配方式,如是否区分大小写、多行匹配等。
-
返回值:返回一个符合表达式匹配结果的迭代器。
锦囊1 获取字符串中的数字
使用 finditer() 方法获取字符串中的所有数值,代码如下:
import re # 导入正则表达式re模块
# 获取字符串中的数字
it = re.finditer(r”\d+”,”12a32bc43jf3”)
# 便利获取后的迭代对象
for match in it:
print (match.group()) # 打印数字
15. fullmatch()方法,对整个字符串进行匹配
语法参考
fullmatch() 方法用于对整个字符串进行匹配,如果整个字符串匹配到正则表达式样式,就返回一个相应的匹配对象,否则就返回一个 None。语法格式如下:
re.fullmatch(pattern,string,flags=0)
参数说明:
-
pattern :表示模式字符串,由要匹配的正则表达式转换而来。
-
string :表示要匹配的字符串。
-
flags :可选参数,表示标志位,用于控制匹配方式,如是否区分字母大小写。
-
返回值:如果整个 string 匹配到正则表达式样式,就返回一个相应的 Match 对象。
锦囊1 匹配整个字符串
使用 fullmatch() 方法实现匹配整个字符串,代码如下:
import re # 导入正则表达式re模块
string1 = “mr00soft” # 需要匹配的字符串
# 匹配包括下划线在内的任何字符,并匹配前面的子表达式一次或多次
match1 = re.fullmatch(‘\w+’, string1)
# 单个字符匹配任意次,贪婪匹配
match2 = re.fullmatch(‘.*’, string1)decimal
# 匹配多个数字
match3 = re.fullmatch(‘\d+’, string1)
print(match1)
print(match2)
print(match3)
程序运行结果如下:
<re.Match object; span=(0, 8), match='mr00soft'>
<re.Match object; span=(0, 8), match='mr00soft'>
None
16. match()方法,从字符开始处进行匹配
语法参考
match() 方法用于从字符串的开始处进行匹配,如果在起始位置匹配成功,则返回 Match 对象,否则返回 None。语法格式如下:
re.match(pattern,string,flags=0)
参数说明:
-
pattern :表示模式字符串,由要匹配的正则表达式转换而来。
-
string :表示要匹配的字符串。
-
flags :可选参数,表示标志位,用于控制匹配方式,如是否区分字母大小写。
-
返回值:如果 string 的开始处有 0 或多个字符匹配到了正则表达式样式,就返回一个相应的 Match 对象。
锦囊1 判断匹配字符串是否以“mr_”开头
使用 match() 方法判断匹配字符串是否以“mr_”开头,不区分字母大小写,代码如下:
import re # 导入正则表达式re模块
pattern = r’mr_\w+’ # 模式字符串
string = ‘MR_SHOP mr_shop’ # 要匹配的字符串
match = re.match(pattern,string,re.I) # 匹配字符串,不区分大小写
print(match) # 打印匹配结果
string = ‘项目名称MR_SHOP mr_shop’
match = re.match(pattern,string,re.I) # 匹配字符串,不区分大小写
print(match) # 打印匹配结果
程序运行结果如下:
<re.Match object; span=(0, 7), match='MR_SHOP'>
None
17. search()方法,搜索第一个匹配位置
语法参考
search() 方法用于在整个字符串中搜索第一个匹配的值,如果匹配成功,则返回 Match 对象,否则返回 None。语法格式如下:
re.search(pattern,string,flags=0)
参数说明:
-
pattern :表示模式字符串,由要匹配的正则表达式转换而来。
-
string :表示要匹配的字符串。
-
flags :可选参数,表示标志位,用于控制匹配方式,如是否区分字母大小写。
-
返回值:扫描整个字符串找到匹配样式的第一个位置,并返回一个相应的匹配对象。如果没有匹配,就返回一个 None。注意,这和找到一个零长度匹配是不同的。
锦囊1 搜索第一个以“mr_”开头的字符串
使用 search() 方法搜索第一个以“mr_”开头的字符串,不区分字母大小写,代码如下:
import re # 导入正则表达式re模块
pattern = r’mr_\w+’ # 模式字符串
string = ‘MR_SHOP mr_shop’ # 要匹配的字符串
match = re.search(pattern,string,re.I) # 搜索字符串,不区分大小写
print(match) # 打印匹配结果
string = ‘项目名称MR_SHOP mr_shop’
match = re.search(pattern,string,re.I) # 搜索字符串,不区分大小写
print(match) # 打印匹配结果
程序运行结果如下:
<re.Match object; span=(0, 7), match='MR_SHOP'>
<re.Match object; span=(4, 11), match='MR_SHOP'>
18. split()方法,根据正则表达式分割字符串
语法参考
split() 方法用于实现根据正则表达式分割字符串,并以列表的形式返回。其作用同字符串对象的 split() 方法类似,所不同的就是分割字符由模式字符串指定。语法格式如下:
re.split(pattern,string,maxsplit=0,flags=0)
参数说明:
-
pattern :表示模式字符串,由要匹配的正则表达式转换而来。
-
string :表示要匹配的字符串。
-
maxsplit :可选参数,表示最大的拆分次数。
-
flags :可选参数,表示标志位,用于控制匹配方式,如是否区分字母大小写。
-
返回值:返回一个分割后的字符串列表。
锦囊1 从给定的 URL 地址中提取出请求地址和各个参数
使用split()方法实现从给定的 URL 地址中提取出请求地址和各个参数的功能,代码如下:
import re # 导入正则表达式re模块
pattern = r’[?|&]’ # 定义分割符
url = ‘http://www.888.com/login.jsp?username=”mr”&pwd=”mrsoft”’
result = re.split(pattern,url) # 分割字符串
print(result)
程序运行结果如下:
['http://www.888.com/login.jsp','username="mr"','pwd="mrsoft"']
19. sub()方法,字符串替换
语法参考
sub() 方法用于实现字符串替换。语法格式如下:
re.sub(pattern,repl,string,count=0,flags=0)52
参数说明:
-
pattern :表示模式字符串,由要匹配的正则表达式转换而来。
-
repl :表示替换的字符串。
-
string :表示要被查找替换的原始字符串。
-
count :可选参数,表示模式匹配后替换的最大次数,默认值为 0,表示替换所有的匹配。
-
flags :可选参数,表示标志位,用于控制匹配方式,如是否区分字母大小写。
-
返回值:返回替换后的字符串。
锦囊1 隐藏中奖信息中的手机号码
使用 sub() 方法实现隐藏中奖信息中的手机号码的功能,代码如下:
import re # 导入正则表达式re模块
pattern = r’1[34578]\d{9}’ # 定义要替换的模式字符串
string = ‘中奖号码为:84978981 联系电话为:13611111111’
result = re.sub(pattern,’1XXXXXXXXXX’,string) # 替换字符串
print(result)
程序运行结果如下:
中奖号码为:84978981 联系电话为:1XXXXXXXXXX
锦囊2 排除字符串中的汉字、字母与数字
使用 sub() 方法排除字符串中的汉字、字母与数字,代码如下:
import re
# 定义需要筛选的字符串
string = ‘abcdefghijklmnopqrstuvwxyz我爱Python0123456789!#$%&*+-.^_`|~’
result = re.sub(“[A-Za-z0-9\u4e00-\u9fa5]”, ““, string) # 替换字符串
print(result) # 打印替换结果
程序运行结果如下:
!#$%&*+-.^_`|~
20. subn()方法,字符串替换 (含替换次数)
语法参考
subn() 方法与 sub() 方法相同,都是用于实现字符串的替换。但 subn() 方法返回一个元组,其中包含新字符串和替换次数。语法格式如下:
re.subn(pattern,repl,string,count=0,flags=0)
参数说明:
-
pattern :表示模式字符串,由要匹配的正则表达式转换而来。
-
repl :表示替换的字符串。
-
string :表示要被查找替换的原始字符串。
-
count :可选参数,表示模式匹配后替换的最大次数,默认值为 0,表示替换所有的匹配。
-
flags :可选参数,表示标志位,用于控制匹配方式,如是否区分字母大小写。
-
返回值:返回一个包含替换后字符串与替换次数的元组。
锦囊1 替换字符串中的指定内容
使用 subn() 方法实现替换字符串中的指定内容的功能,代码如下:
import re # 导入正则表达式re模块
print(re.subn(‘[1-2]’,’A’,’123456abcdef’)) # 打印元组,包含新字符串与替换次数
print(re.sub(‘g.t’,’have’,’I get A, I got B ,I gut C’)) # 打印新字符串
print(re.subn(‘g.t’,’have’,’I get A, I got B ,I gut C’)) # 打印元组,包含新字符串与替换次数
21. Pattern.flags属性,获取正则匹配标记
语法参考
Pattern.flags 属性用于获取正则表达式中匹配模式对应的标记。语法格式如下:
Pattern.flags
锦囊1 获取常见匹配模式对应的标记
使用 Pattern.flags 属性获取常见匹配模式对应的标记,代码如下:
import re # 导入正则表达式re模块
pattern_I = re.compile(‘\w+’,flags=re.I) # 匹配模式,忽略大小写
pattern_M= re.compile(‘\w+’,flags=re.M) # 匹配模式,多行
pattern_S = re.compile(‘\w+’,flags=re.S) # 匹配模式,使用“.”字符匹配所有字符,包括换行符
pattern_X = re.compile(‘\w+’,flags=re.X) # 匹配模式,忽略模式字符串中未转义的空格和注释
print(‘匹配模式I的标记为:',pattern_I.flags)
print(‘匹配模式M的标记为:',pattern_M.flags)
print(‘匹配模式S的标记为:',pattern_S.flags)
print(‘匹配模式X的标记为:',pattern_X.flags)
22. Pattern.groups属性,捕获组合的数量
语法参考
Pattern.groups 属性用于获取正则表达式中组合的数量。语法格式如下:
Pattern.groups
锦囊1 获取正则表达式中组合的数量
使用 Pattern.groups 属性获取正则表达式中组合的数量,代码如下:
import re # 导入正则表达式re模块
pattern = re.compile(‘(\w+) (\w+)’) # 组合表达式
print(‘组合数量为:',pattern.groups)
23. Pattern.groupindex属性,获取分组名称与对应的分组编号
语法参考
Pattern.groupindex 属性用于获取正则表达式中分组名称与对应的分组编号。语法格式如下:
Pattern.groupindex
锦囊1 获取表达式中分组名称与对应的分组编号
使用 Pattern.groupindex 属性获取表达式中分组名称与对应的分组编号,代码如下:
import re # 导入正则表达式re模块
pattern = re.compile(‘(?P<group_1>\w+) (?P<group_2>\w+)’) # 分组表达式
print(‘分组名称与对应的编号为:',pattern.groupindex)
程序运行结果如下:
分组名称与对应的编号为: {'group_1': 1, 'group_2': 2}
24. Pattern.pattern属性,获取模式字符串
语法参考
Pattern.pattern 属性用于获取正则表达式中的模式字符串。语法格式如下:
Pattern.pattern
锦囊1 获取表达式中的模式字符串
使用 Pattern.pattern 属性获取表达式中的模式字符串,代码如下:
import re # 导入正则表达式re模块
pattern = re.compile(‘(?P<group_1>\w+) (?P<group_2>\w+)’) # 分组表达式
print(pattern.pattern)
程序运行结果如下:
(?P<group_1>\w+) (?P<group_2>\w+)
25. Pattern.f indall()方法,搜索所有符合正则表达式的字符串
语法参考
Pattern.findall() 方法用于在整个字符串中搜索所有符合正则表达式的字符串,并以列表的形式返回。如果匹配成功,则返回包含匹配结构的列表,否则返回空列表。该方法可以指定匹配字符串的范围。语法格式如下:
Pattern.findall(string[,pos[,endpos]])
参数说明:
-
string :表示需要匹配的字符串。
-
pos :表示匹配的起始位置,该参数为可选参数,默认值为 0。
-
endpos :表示匹配的结束位置,该参数为可选参数,默认为需要匹配字符串的长度,所以只有从 pos 到 endpos-1 的字符会被匹配。
-
返回值:返回一个符合表达式匹配结果的列表。
锦囊1 搜索字符串中以“mr_”开头的字符串
使用 Pattern.findall() 方法搜索字符串中以“mr_”开头的字符串,代码如下:
import re # 导入正则表达式re模块
pattern = re.compile(‘mr_\w+’) # 正则表达式对象
string = ‘mr_SHOP mr_shop’ # 要匹配的字符串
match = pattern.findall(string) # 搜索字符串
print(match) # 打印匹配结果
print(pattern.findall(string,0,5)) # 打印下标0~5的结果
程序运行结果如下:
['mr_SHOP', 'mr_shop']
['mr_SH']
26. Pattern.f inditer()方法,搜索所匹配的所有子串
语法参考
Pattern.finditer() 方法用于在字符串中找到正则表达式所匹配的所有子串,把它们作为一个迭代器返回。该方法可以指定匹配字符串的范围。语法格式如下:
Pattern.finditer(string[,pos[,endpos]])
参数说明:
-
string :表示需要匹配的字符串。
-
pos :表示匹配的起始位置,该参数为可选参数,默认值为 0。
-
endpos :表示匹配的结束位置,该参数为可选参数,默认为需要匹配字符串的长度,所以只有从 pos 到 endpos-1 的字符会被匹配。
-
返回值:返回一个符合表达式匹配结果的迭代器。
锦囊1 获取字符串中指定范围的所有数字
使用 Pattern.finditer() 方法获取字符串中指定范围的所有数字,代码如下:
import re # 导入正则表达式re模块
pattern = re.compile(‘\d+’) # 正则表达式对象
string = ‘12a32bc43jf3’ # 要匹配的字符串
it = pattern.finditer(string,2,8)
# 遍历获取后的迭代对象
for match in it:
print (match.group()) # 打印数字
27. Pattern.fullmatch()方法,对整个字符串匹配
语法参考
Pattern.fullmatch() 方法用于对整个字符串匹配。从 pos 下标位置开始逐个对字符串进行匹配直到 endpos 下标位置,如果匹配成功则返回匹配成功的 Match 对象;如果没有匹配成功,就返回None。语法格式如下:
Pattern.fullmatch(string[,pos[,endpos]])
参数说明:
-
string :表示需要匹配的字符串。
-
pos :表示匹配的起始位置,该参数为可选参数,默认值为 0。
-
endpos :表示匹配的结束位置,该参数为可选参数,默认为需要匹配字符串的长度,所以只有从 pos 到 endpos-1 的字符会被匹配。
-
返回值:如果整个 string 匹配到正则表达式样式,就返回一个相应的 Match 对象。
锦囊1 获取字符串中开始处符合表达式的值
使用 Pattern.fullmatch() 方法获取字符串中开始处符合表达式的值,代码如下:
import re # 导入正则表达式re模块
pattern = re.compile(‘[a-z]+’) # 定义匹配字母的表达式
string = ‘abcskd123jaw123’ # 需要匹配的字符串
print(pattern.fullmatch(string,0,5)) # 打印匹配结果,匹配范围0~5
程序运行结果如下:
<re.Match object; span=(0, 5), match='abcsk'>
28. Pattern.match()方法,从字符开始处匹配字符串的值
语法参考
Pattern.match() 方法用于从字符开始处匹配字符串的值,从 pos 下标位置开始逐个对字符串进行匹配直到 endpos 下标位置,如果匹配成功则返回匹配成功的 Match 对象;如果没有匹配成功,就返回 None。语法格式如下:
Pattern.match(string[,pos[,endpos]])
参数说明:
-
string :表示需要匹配的字符串。
-
pos :表示匹配的起始位置,该参数为可选参数,默认值为 0。
-
endpos :表示匹配的结束位置,该参数为可选参数,默认为需要匹配字符串的长度,所以只有从 pos 到 endpos-1 的字符会被匹配。
-
返回值:如果 string 开始的位置可以匹配到正则表达式样式,就返回一个相应的 Match 对象。
锦囊 获取字符串中开始处符合表达式的值
使用 Pattern.match() 方法获取字符串中开始处符合表达式的值,代码如下:
import re # 导入正则表达式re模块
pattern = re.compile(‘[a-z]+’) # 定义匹配字母的表达式
string = ‘12312abc1234546lskdj’ # 需要匹配的字符串
print(pattern.match(string,5,10)) # 打印匹配结果,匹配范围5~10
程序运行结果如下:
<re.Match object; span=(5, 8), match='abc'>
29. Pattern.search()方法,搜索第一个匹配的位置
语法参考
Pattern.search() 方法用于搜索第一个匹配的位置,从 pos 下标位置开始逐个对字符串进行匹配直到 endpos 下标位置,如果匹配成功,则返回匹配成功的 Match 对象,否则返回 None。语法格式如下:
Pattern.search(string[,pos[,endpos]])
参数说明:
-
string :表示需要匹配的字符串。
-
pos :表示匹配的起始位置,该参数为可选参数,默认值为 0。
-
endpos :表示匹配的结束位置,该参数为可选参数,默认为需要匹配字符串的长度,所以只有从 pos 到 endpos-1 的字符会被匹配。
-
返回值:扫描整个字符串找到匹配样式的第一个位置,并返回一个相应的匹配对象。
锦囊1 获取字符串中第一个匹配值与位置
使用 Pattern.search() 方法获取字符串中第一个匹配值与位置,代码如下:
import re # 导入正则表达式re模块
pattern = re.compile(‘[0-9]+’) # 定义匹配数字的表达式
string = ‘12312abc1234546lskdj’ # 需要匹配的字符串
print(pattern.search(string,0,10)) # 打印匹配结果,匹配范围0~10
程序运行结果如下:
<re.Match object; span=(0, 5), match='12312'>
30. Pattern.split()方法,同split()方法
语法参考
Pattern.split() 方法与 re.split() 方法相同,用于实现根据正则表达式分割字符串,并以列表的形式返回。其作用同字符串对象的 split() 方法类似,所不同的是分割字符由模式字符串指定。语法格式如下:
Pattern.split(string,maxsplit=0)
参数说明:
-
string :表示需要匹配的字符串。
-
maxsplit :可选参数,表示最大的拆分次数。
-
返回值:返回一个分割后的字符串列表。
锦囊1 从给定的 URL 地址中提取出请求地址和各个参数
使用 Pattern.split() 方法实现从给定的 URL 地址中提取出请求地址和各个参数,代码如下:
import re # 导入正则表达式re模块
pattern = re.compile(‘[?|&]’) # 定义分割符
url = ‘http://www.888.com/login.jsp?username=”mr”&pwd=”999”’
result = pattern.split(url) # 分割字符串
print(result)
['http://www.888.com/login.jsp', 'username="mr"', 'pwd="999"']
31. Pattern.sub()方法,字符串替换
语法参考
Pattern.sub() 方法与 re.sub() 方法相同,用于实现字符串替换。语法格式如下:
Pattern.sub(repl,string,count=0)
参数说明:
-
repl :表示替换的字符串。
-
string :表示要被查找替换的原始字符串。
-
count :可选参数,表示模式匹配后替换的最大次数,默认值为 0,表示替换所有的匹配。
-
返回值:返回替换后的字符串。
锦囊1 隐藏中奖信息中的手机号码
使用 Pattern.sub() 方法实现隐藏中奖信息中的手机号码的功能,代码如下:
import re # 导入正则表达式re模块
pattern = re.compile(‘1[34578]\d{9}’) # 定义要替换的模式字符串
string = ‘中奖号码为:84978981 联系电话为:13611111111’
result = pattern.sub(‘1XXXXXXXXXX’,string) # 替换字符串
print(result)
32. Pattern.subn()方法,字符串替换(含替换次数)
语法参考
Pattern.subn() 方法与 re.subn() 方法相同,都是用于实现字符串的替换并返回一个元组,其中包含新字符串和替换次数。语法格式如下:
Pattern.subn(repl,string,count=0)
参数说明:
-
repl :表示替换的字符串。
-
string :表示要被查找替换的原始字符串。
-
count :可选参数,表示模式匹配后替换的最大次数,默认值为 0,表示替换所有的匹配。
-
返回值:返回一个包含替换后字符串与替换次数的元组。
锦囊 替换字符串中的指定内容
使用 Pattern.subn() 方法实现替换字符串中的指定内容的功能,代码如下:
import re # 导入正则表达式re模块
pattern = re.compile(‘[1-2]’) # 数值替换表达式,替换字符串中的1-2
pattern2 = re.compile(‘g.t’) # 字幕替换表达式,替换字符串中的get、got、gut
# 需要匹配的字符串
string = ‘123456abcdef’
string2 = ‘I get A, I got B ,I gut C’
print(pattern.subn(‘A’,string)) # 打印元组,包含新字符串与替换次数
print(pattern2.sub(‘have’,string2)) # 打印新字符串
print(pattern2.subn(‘have’,string2)) # 打印元组,包含新字符串与替换次数
33. Match.endpos属性,结束匹配的索引位置
语法参考
Match.endpos 属性用于获取正则表达式在字符串结束匹配的索引位置。语法格式如下:
Match.endposdecimal
锦囊1 获取正则表达式在字符串结束匹配的索引位置
使用 Match.endpos 属性获取正则表达式在字符串结束匹配的索引位置,代码如下:
import re # 导入正则表达式re模块
pattern = re.compile(‘mr_\w+’) # 分组表达式
string = ‘MR_SHOP mr_shop’ # 要匹配的字符串
match=re.search(pattern,string) # 匹配结果Match对象
print(match) # 打印匹配的Match对象
print(match.endpos) # 打印匹配的结束位置
程序运行结果如下:
<re.Match object; span=(8, 15), match='mr_shop'>
15
34. Match.pos属性,开始匹配的索引位置
语法参考
Match.pos 属性用于获取正则表达式在字符串开始匹配的索引位置。语法格式如下:
Match.pos
锦囊1 获取正则表达式在字符串开始匹配的索引位置
使用 Match.pos 属性获取正则表达式在字符串开始匹配的索引位置,代码如下:
import re # 导入正则表达式re模块
pattern = re.compile(‘mr_\w+’) # 分组表达式
string = ‘MR_SHOP mr_shop’ # 要匹配的字符串
match=re.search(pattern,string) # 匹配结果Match对象
print(match) # 打印匹配的Match对象
print(match.pos) # 打印匹配的起始位置
程序运行结果如下:
<re.Match object; span=(8, 15), match='mr_shop'>
0
35. Match.lastindex属性,捕获组的最后一个匹配的索引值
语法参考
Match.lastindex 属性用于捕获组的最后一个匹配的索引值。语法格式如下:
Match.lastindex
锦囊1 获取最后一个匹配到的组所对应的索引值
使用 Match.lastindex 属性获取最后一个匹配到的组所对应的索引值,代码如下:
import re # 导入正则表达式re模块
pattern = re.compile(‘(?P<group_1>\w+) (?P<group_2>\w+)’,re.I) # 分组表达式
string = ‘MR_SHOP mr_shop’ # 要匹配的字符串
match=re.match(pattern,string) # 匹配结果Match对象
print(match.lastindex) # 打印最后一个匹配到的组所对应的索引值
36. Match.lastgroup属性,获取最后一个匹配组的名称
语法参考
Match.lastgroup 属性用于获取最后一个匹配组的名称,如果匹配的组没有名字或者没有产生匹配的情况下,则返回 None。语法格式如下:
Match.lastgroup
锦囊1 获取最后一个匹配组的名称
使用 Match.lastgroup 属性获取最后一个匹配组的名称,代码如下:decimal
import re # 导入正则表达式re模块
pattern = re.compile(‘(?P<group_1>\w+) (?P<group_2>\w+)‘,re.I) # 分组表达式
string = ‘MR_SHOP mr_shop‘ # 要匹配的字符串
match=re.match(pattern,string) # 匹配结果Match对象
print(match.lastgroup) # 打印最后一个匹配组的名称
37. Match.re属性,返回正则表达式对象
语法参考
Match.re 属性用于获取产生 Match 实例的正则表达式对象。语法格式如下:
Match.re
锦囊1 获取产生 Match 实例的正则表达式对象
使用 Match.re 属性获取产生 Match 实例的正则表达式对象,代码如下:
import re # 导入正则表达式re模块
pattern = re.compile(‘(?P<group_1>\w+) (?P<group_2>\w+)‘,re.I) # 分组表达式
string = ‘MR_SHOP mr_shop‘ # 要匹配的字符串
match=re.match(pattern,string) # 匹配结果Match对象
print(match.re) # 打印获取的表达式对象
程序运行结果如下:
re.compile('(?P<group_1>\\w+) (?P<group_2>\\w+)', re.IGNORECASE)
38. Match.string属性,获取需要匹配的字符串
语法参考
Match.string 属性用于获取 Match 对象中需要匹配的字符串。语法格式如下:
Match.string
锦囊1 获取 Match 对象中需要匹配的字符串
使用 Match.string 属性获取 Match 对象中需要匹配的字符串,代码如下:
import re # 导入正则表达式re模块
pattern = re.compile(‘(?P<group_1>\w+) (?P<group_2>\w+)‘,re.I) # 分组表达式
string = ‘MR_SHOP mr_shop‘ # 要匹配的字符串
match=re.match(pattern,string) # 匹配结果Match对象
print(match.string) # 打印Match对象中需要匹配的字符串
39. Match.__getitem__()方法,返回一个匹配的分组信息
语法参考
Match.__getitem__() 方法与 Match.group() 方法相似,只是 __getitem__() 方法每次只能获取一个分组的信息。语法格式如下:
Match.__getitem__(g)
参数说明:
-
g :表示分组对应的编号或分组名称。
-
返回值:返回一个匹配的分组信息。
锦囊1 获取指定分组对应的信息
使用 Match.getitem() 方法获取指定分组对应的信息,代码如下:
import re # 导入正则表达式re模块
pattern = re.compile(‘(?P<group_1>\w+) (?P<group_2>\w+)‘,re.I) # 分组表达式
string = ‘MR_SHOP mr_shop‘ # 要匹配的字符串
match=re.match(pattern,string) # 匹配结果Match对象
print(match.__getitem__(1)) # 打印指定分组编号对应内容
print(match.__getitem__(‘group_2’)) # 打印指定分组名对应内容
40. Match.end()方法,返回分组匹配字符串对应的结束标记
语法参考
Match.end() 方法用于获取分组匹配字符串对应的结束标记。语法格式如下:
Match.end([group])
参数说明:
-
group :表示分组名或者分组名对应的编号。
-
返回值:返回分组匹配字符串对应的结束标记。
锦囊1 获取分组匹配字符串对应的开始、结束标记
使用 Match.start() 方法与 Match.end() 方法获取分组匹配字符串对应的开始、结束标记,代码如下:
import re # 导入正则表达式re模块
pattern = re.compile(‘(?P<group_1>\w+) (?P<group_2>\w+)’,re.I) # 分组表达式
string = ‘MR_SHOP mr_shop’ # 要匹配的字符串
match=re.match(pattern,string) # 匹配结果Match对象
print(match.start(),match.end()) # 打印全部分组的匹配字符串对应的开始、结束标记
print(match.start(1),match.end(1)) # 打印编号1分组的匹配字符串对应的开始、结束标记
print(match.start(2),match.end(2)) # 打印编号2分组的匹配字符串对应的开始、结束标记
# 打印分组名的匹配字符串对应的开始、结束标记
print(match.start(‘group_1’),match.end(‘group_2’))
41. Match.expand()方法,对“\”进行转义替换并返回
语法参考
Match.expand() 方法用于实现把字符串中用反斜杠“\”表示的数字或组名替换为相应分组中的值的功能。语法格式如下:
Match.expand(template)
参数说明:
-
template :表示需要替换的字符串。
-
返回值:返回对“\”进行转义替换的结果。
锦囊1 在字符串中指定位置替换对应分组中的值
使用 Match.expand() 方法,在字符串中指定位置替换对应分组中的值,代码如下:
import re # 导入正则表达式re模块
pattern = re.compile(‘(?P<group_1>\w+) (?P<group_2>\w+)‘,re.I) # 分组表达式
string = ‘MR_SHOP mr_shop‘ # 要匹配的字符串
match=re.match(pattern,string) # 匹配结果Match对象
print(match[1]) # 打印分组1内容
print(match[2 # 打印分组2内容
# 第一种替换方式,\1、\2替换分组1和2的内容
print(match.expand(r‘first_ \1 \2‘))
# 第二种替换方式,\g<1>、\g<2>替换分组1和2的内容
print(match.expand(‘second_ \g<1> \g<2>‘))
# 第三种替换方式,\g<group_1>、\g<group_2>替换分组1和2的内容
print(match.expand(‘third_ \g<group_1> \g<group_2>‘))
42. Match.groups()方法,以元组形式返回所有子组中内容
语法参考
Match.groups() 方法用于获取以元组形式返回所有子组中内容。语法格式如下:
Match.groups(default=None)
参数说明:
-
default :用于不参与匹配的情况,默认为 None。
-
返回值:以元组形式返回所有子组中内容。
锦囊1 获取所有分组对应的内容
使用 Match.groups() 方法获取所有分组对应的内容,代码如下:
import re # 导入正则表达式re模块
pattern = re.compile(‘(?P<group_1>\w+) (?P<group_2>\w+)’,re.I) # 分组表达式
string = ‘MR_SHOP mr_shop’ # 要匹配的字符串
match=re.match(pattern,string) # 匹配结果Match对象
print(match.groups()) # 打印所有分组对应的内容
43. Match.group()方法,返回一个或者多个匹配的子组
语法参考
Match.group() 方法用于获取 Match 对象中一个或多个匹配的子组。如果只有一个(0~99)参数,结果就是一个字符串;如果有多个参数,结果就是一个元组(每个参数对应一个项);如果没有参数,组 1 默认到 0(整个匹配都被返回)。如果一个组 N 参数值为 0,相应的返回值就是整个匹配字符串;如果一个组号是负数或超出组的最大长度,则给出越界错误;如果正则表达式中的一个组匹配了多个值,则相应的组只保存最后匹配的值。语法格式如下:
Match.group([group1, ...])
参数说明:
-
group1 :表示分组对应的编号或分组名称。
-
返回值:返回一个或者多个匹配的子组。
锦囊 获取指定分组对应的信息
使用 Match.group() 方法获取指定分组对应的信息,代码如下:
import re # 导入正则表达式re模块
pattern = re.compile(‘(?P<group_1>\w+) (?P<group_2>\w+)’,re.I) # 分组表达式
string = ‘MR_SHOP mr_shop’ # 要匹配的字符串
match=re.match(pattern,string) # 匹配结果Match对象
print(match.group()) # 无参数打印全部内容
print(match.group(1)) # 打印指定分组编号对应内容
print(match.group(‘group_2’)) # 打印指定分组名对应内容
44. Match.groupdict()方法,返回包含所有匹配值分组的字典
语法参考
Match.groupdict()方法用于获取以字典形式返回包含所有匹配值分组的信息,其中key就是组名,value 就是分组匹配的信息内容。语法格式如下:
Match.groupdict(default=None)
参数说明:
-
default :用于不参与匹配的情况,默认为 None。
-
返回值:以字典形式返回包含所有匹配值分组的信息。
锦囊1 获取字典形式的分组信息
使用 Match.groupdict() 方法获取字典形式的分组信息,代码如下:
import re # 导入正则表达式re模块
pattern = re.compile(‘(?P<group_1>\w+) (?P<group_2>\w+)’,re.I) # 分组表达式
string = ‘MR_SHOP mr_shop’ # 要匹配的字符串
match=re.match(pattern,string) # 匹配结果Match对象
print(match.groupdict()) # 打印字典形式的分组信息
45. Match.span()方法,返回包含开始和结束位置的二元组
语法参考
Match.span() 方法用于获取指定分组匹配字符串的开始和结束位置。语法格式如下:
Match.span([group])
参数说明:
-
group :表示分组名或者分组名对应的编号。
-
返回值:返回一个包含开始和结束位置的二元组。
锦囊1 获取指定分组匹配字符串的开始和结束位置
使用 Match.span() 方法获取指定分组匹配字符串的开始和结束位置,代码如下:
import re # 导入正则表达式re模块
pattern = re.compile(‘(?P<group_1>\w+) (?P<group_2>\w+)’,re.I) # 分组表达式
string = ‘MR_SHOP mr_shop’ # 要匹配的字符串
match=re.match(pattern,string) # 匹配结果Match对象
print(match.span(1)) # 打印分组编号1匹配字符串对应的开始、结束标记
print(match.span(‘group_2’)) # 打印分组名group_2匹配字符串对应的开始、结束标记
46. Match.start()方法,返回分组匹配字符串对应的开始标记
语法参考
Match.start() 方法用于获取分组匹配字符串对应的开始标记。语法格式如下:
Match.start([group])
参数说明:
-
group :表示分组名或者分组名对应的编号。
-
返回值:返回分组匹配字符串对应的开始标记。
锦囊1 获取分组匹配字符串对应的开始、结束标记
使用 Match.start() 方法与 Match.end() 方法获取分组匹配字符串对应的开始、结束标记,代码如下:
import re # 导入正则表达式re模块
pattern = re.compile(‘(?P<group_1>\w+) (?P<group_2>\w+)’,re.I) # 分组表达式
string = ‘MR_SHOP mr_shop’ # 要匹配的字符串
match=re.match(pattern,string) # 匹配结果Match对象
print(match.start(),match.end()) # 打印全部分组的匹配字符串对应的开始、结束标记
print(match.start(1),match.end(1)) # 打印编号1分组的匹配字符串对应的开始、结束标记
print(match.start(2),match.end(2)) # 打印编号2分组的匹配字符串对应的开始、结束标记
# 打印分组名的匹配字符串对应的开始、结束标记
print(match.start(‘group_1’),match.end(‘group_2’))