三十四、Python之RE模块的使用
RE 模块是Python的标准库模块,直接引入就可以直接使用,具体的功能包含如下:
regex = compile(pattern,flags = 0)
功能: 生产正则表达式对象
参数: pattern 正则表达式
flags 功能标志位,扩展正则表达式的匹配
返回值: 正则表达式对象
re.findall(pattern,string,flags = 0)
功能: 根据正则表达式匹配目标字符串内容
参数: pattern 正则表达式
string 目标字符串
flags 功能标志位,扩展正则表达式的匹配
返回值: 匹配到的内容列表,如果正则表达式有子组则只能获取到子组对应的内容
regex.findall(string,pos,endpos)
功能: 根据正则表达式匹配目标字符串内容
参数: string 目标字符串
pos 截取目标字符串的开始匹配位置
endpos 截取目标字符串的结束匹配位置
返回值: 匹配到的内容列表,如果正则表达式有子组则只能获取到子组对应的内容
re.split(pattern,string,flags = 0)
功能: 使用正则表达式匹配内容,切割目标字符串
参数: pattern 正则表达式
string 目标字符串
flags 功能标志位,扩展正则表达式的匹配
返回值: 切割后的内容列表
re.sub(pattern,replace,string,count,flags = 0)
功能: 使用一个字符串替换正则表达式匹配到的内容
参数: pattern 正则表达式
replace 替换的字符串
string 目标字符串
count 最多替换几处,默认替换全部
flags 功能标志位,扩展正则表达式的匹配
返回值: 替换后的字符串
re.subn(pattern,replace,string,count,flags = 0)
功能: 使用一个字符串替换正则表达式匹配到的内容
参数: pattern 正则表达式
replace 替换的字符串
string 目标字符串
count 最多替换几处,默认替换全部
flags 功能标志位,扩展正则表达式的匹配
返回值: 替换后的字符串和替换了几处
示例:
"""
re模块
"""
import re
s = "Alex:1997,Sunny:1996" # 目标字符串
pattern = r"\w+:\d+" # 正则表达式
# re模块调用
l = re.findall(pattern, s)
print(l) # ['Alex:1997', 'Sunny:1996']
# 正则对象调用
regex = re.compile(pattern)
l = regex.findall(s, 0, 10)
print(l) # ['Alex:1997']
# 正则表达式内容切割字符串
l = re.split(r',', s)
print(l) # ['Alex:1997', 'Sunny:1996']
# 替换目标字符串
s = re.subn(r':', '--', s, 4)
print(s) # ('Alex--1997,Sunny--1996', 2)
re.finditer(pattern,string,flags = 0)
功能: 根据正则表达式匹配目标字符串内容
参数: pattern 正则表达式
string 目标字符串
flags 功能标志位,扩展正则表达式的匹配
返回值: 匹配结果的迭代器
re.fullmatch(pattern,string,flags=0)
功能:完全匹配某个目标字符串,相当于正则首部添加^,末尾添加$
参数:pattern 正则
string 目标字符串
返回值:匹配内容match object
re.match(pattern,string,flags=0)
功能:匹配某个目标字符串开始位置,相当于正则首部添加^
参数:pattern 正则
string 目标字符串
返回值:匹配内容match object
re.search(pattern,string,flags=0)
功能:匹配目标字符串第一个符合内容
参数:pattern 正则
string 目标字符串
返回值:匹配内容match object
compile对象属性
【1】 pattern : 正则表达式
【2】 groups : 子组数量
【3】 groupindex : 捕获组名与组序号的字典
示例:
"""
re模块演示
生成match对象的函数
"""
import re
s = "热烈庆祝建国70周年,1949年至今,人口14亿"
pattern = r'\d+'
# 返回迭代对象
it = re.finditer(pattern, s)
# 每个match对象对应一处匹配内容
for i in it:
print(i.group()) # 获取match对象匹配内容,70 1949 14
# 完全匹配
obj = re.fullmatch(r'.+', s)
print(obj.group()) # 热烈庆祝建国70周年,1949年至今,人口14亿
# 匹配开始位置
obj = re.match(r'\w+', s)
print(obj.group()) # 热烈庆祝建国70周年
# 匹配第一处
obj = re.search(r'\d+', s)
print(obj.group()) # 70
match对象的属性方法
1. 属性变量
pos 匹配的目标字符串开始位置
endpos 匹配的目标字符串结束位置
re 正则表达式
string 目标字符串
lastgroup 最后一组的名称
lastindex 最后一组的序号
2. 属性方法
span() 获取匹配内容的起止位置
start() 获取匹配内容的开始位置
end() 获取匹配内容的结束位置
groupdict() 获取捕获组字典,组名为键,对应内容为值
groups() 获取子组对应内容
group(n = 0)
功能:获取match对象匹配内容
参数:默认为0表示获取整个match对象内容,如果是***或者组名则表示获取对应子组内容
返回值:匹配字符串
示例:
"""
match对象属性方法演示
"""
import re
pattern = r'(ab)cd(?P<pig>ef)'
regex = re.compile(pattern)
obj = regex.search("abcdefghi", 0, 7)
# 属性变量
print(obj.pos) # 目标字符串开始位置 0
print(obj.endpos) # 匹配目标结束位置 7
print(obj.re) # 正则 re.compile('(ab)cd(?P<pig>ef)')
print(obj.string) # 目标字符串 abcdefghi
print(obj.lastgroup) # 最后一组组名 pig
print(obj.lastindex) # 最后一组序号 2
# 属性方法
print(obj.span()) # 匹配内容在目标字符串中的位置 (0, 6)
print(obj.start()) # 匹配内容在目标字符串中的开始位置 0
print(obj.end()) # 匹配内容在目标字符串中的结束位置 6
print(obj.groupdict()) # 捕获组组名和对应内容字典 {'pig': 'ef'}
print(obj.groups()) # 子组对应内容 ('ab', 'ef')
print(obj.group()) # 获取match对象内容 abcdef
print(obj.group('pig')) # ef
flags参数扩展
1. 使用函数:
re模块调用的匹配函数。如:re.compile,re.findall,re.search....
2. 作用:
扩展丰富正则表达式的匹配功能
3. 常用flag
A == ASCII 元字符只能匹配ascii码
I == IGNORECASE 匹配忽略字母大小写
S == DOTALL 使 . 可以匹配换行
M == MULTILINE 使 ^ $可以匹配每一行的开头结尾位置
4. 使用多个flag
方法:使用按位或连接
比如: flags = re.I | re.A
示例:
"""
扩展标志位演示
"""
import re
s = "Hello" \
"北京" \
"hello" \
"上海"
# 只能匹配ASCII编码
# regex = re.compile(r'\w+', flags=re.A) # ['Hello', 'hello']
# 忽略字母大小写
# regex = re.compile(r'[a-z]+', flags=re.I) # ['Hello', 'hello']
# . 可以匹配换行
regex = re.compile(r'.+', flags=re.S) # ['Hello北京hello上海']
# ^ $ 可以匹配每行结尾位置
# regex = re.compile(r'Hello$', flags=re.M)
# pattern = '''hello # 匹配Hello
# \s #匹配换行
# \w+ # 匹配 北京
# '''
# regex = re.compile(pattern, flags=re.X | re.I)
l = regex.findall(s)
print(l)