正则表达式re
文章目录
1.使用
1.1 匹配全部
- 不使用compile对象
rs = re.findall(r'ab', "abcdefabcd")
print(rs) # ['ab', 'ab']
"""
re.findall(pattern,string,flags = 0)
功能: 根据正则表达式匹配目标字符串内容
参数: pattern 正则表达式
string 目标字符串
flags 功能标志位,扩展正则表达式的匹配
返回值: 匹配到的内容列表,如果正则表达式有子组则只能获取到子组对应的内容
"""
- 使用compile对象
pattern = r'ab'
regex = re.compile(r'ab')
rs = regex.findall("abcdefabcd")
print(rs) # ['ab', 'ab']
1.2 切割
- 不使用compile对象
rs = re.split(r'ab', "abcdefabcd")
print(rs) # ['', 'cdef', 'cd']
"""
re.split(pattern,string,max,flags = 0)
功能: 使用正则表达式匹配内容,切割目标字符串
参数: pattern 正则表达式
string 目标字符串
max 最多切割几部分
flags 功能标志位,扩展正则表达式的匹配
返回值: 切割后的内容列表
"""
- 使用compile对象
pattern = r'ab'
regex = re.compile(pattern)
rs = regex.split("abcdefabcd")
print(rs) # ['', 'cdef', 'cd']
1.3 替换
- 不使用compile对象
rs = re.sub(r'ab', "zzz", "abcdefabcd")
print(rs) # zzzcdefzzzcd
rs = re.sub(r'ab', "zzz", "abcdefabcd", 1)
print(rs) # zzzcdefabcd
"""
re.sub(pattern,replace,string,count,flags = 0)
功能: 使用一个字符串替换正则表达式匹配到的内容
参数: pattern 正则表达式
replace 替换的字符串
string 目标字符串
count 最多替换几处,默认替换全部
flags 功能标志位,扩展正则表达式的匹配
返回值: 替换后的字符串
"""
rs = re.subn(r'ab', "zzz", "abcdefabcd")
print(rs) # ('zzzcdefzzzcd', 2)
rs = re.subn(r'ab', "zzz", "abcdefabcd", 1)
print(rs) # ('zzzcdefabcd', 1)
"""
re.subn(pattern,replace,string,count,flags = 0)
功能: 使用一个字符串替换正则表达式匹配到的内容
参数: pattern 正则表达式
replace 替换的字符串
string 目标字符串
count 最多替换几处,默认替换全部
flags 功能标志位,扩展正则表达式的匹配
返回值: 替换后的字符串和替换了几处
"""
- 使用compile对象
pattern = r'ab'
regex = re.compile(pattern)
rs = regex.sub("zzz", "abcdefabcd")
print(rs) # zzzcdefzzzcd
rs = regex.sub("zzz", "abcdefabcd", 1)
print(rs) # zzzcdefabcd
rs = regex.subn("zzz", "abcdefabcd")
print(rs) # ('zzzcdefzzzcd', 2)
rs = regex.subn("zzz", "abcdefabcd", 1)
print(rs) # ('zzzcdefabcd', 1)
2.match对象
finditer()
fullmatch()
match()
search()
这4个方法返回的是match对象m = re.search(r'ab', "abcdefabcd") print(m) # <re.Match object; span=(0, 2), match='ab'>
2.1 match对象的属性与方法
m = re.search(r"(ab)cd(?P<pig>ef)", 'zzabcdefghi')
# 属性变量
print(m) # <re.Match object; span=(2, 8), match='abcdef'>
print(m.pos) # 目标字符串开头索引 0
print(m.endpos) # 目标字符串结尾索引 11
print(m.re) # 正则表达式 re.compile('(ab)cd(?P<pig>ef)')
print(m.string) # 目标字符串 zzabcdefghi
print(m.lastgroup) # 最后一组组名 pig
print(m.lastindex) # 最后一组序列号 2
# 属性方法
print(m.span()) # 匹配到的内容在目标字符串中的起止位置 (2, 8)
print(m.start()) # 获取匹配内容的开始位置 2
print(m.end()) # 获取匹配内容的结束位置 8
print(m.groupdict()) # 捕获组组名和对应匹配内容的字典 {'pig': 'ef'}
print(m.groups()) # 获取所有子组对应的内容 ('ab', 'ef')
print(m.group()) # 获取match对应内容 abcdef
print(m.group('pig')) # ef
2.2 fullmatch()
"""
re.fullmatch(pattern,string,flags=0)
功能:从起始位置开始完全匹配某个目标字符串
参数:pattern 正则
string 目标字符串
返回值:匹配内容match object
"""
rs = re.fullmatch(r'abcd', "abcdefg")
print(rs) # None
rs = re.fullmatch(r'abcd', "abcd")
print(rs) # <re.Match object; span=(0, 4), match='abcd'>
print(rs.group()) # abcd
rs = re.fullmatch(r'abcd', "zabcd")
print(rs) # None
2.3 match()
"""
re.match(pattern,string,flags=0)
功能:从起始位置匹配某个目标字符串
参数:pattern 正则
string 目标字符串
返回值:匹配内容match object
"""
rs = re.match(r'abcd', "abcdefg")
print(rs) # <re.Match object; span=(0, 4), match='abcd'>
print(rs.group()) # abcd
rs = re.fullmatch(r'abcd', "zabcd")
print(rs) # None
2.4 finditer()
"""
功能: 匹配目标字符串内容所有符合的内容
参数: pattern 正则表达式
string 目标字符串
flags 功能标志位,扩展正则表达式的匹配
返回值: 匹配结果的迭代器
"""
rs = re.finditer(r'abcd', "zzzabcdzzzabcdzzzz")
for m in rs:
print(m)
print(m.group())
# <re.Match object; span=(3, 7), match='abcd'>
# abcd
# <re.Match object; span=(10, 14), match='abcd'>
# abcd
2.5 search()
"""
功能:匹配目标字符串第一个符合内容
参数:pattern 正则
string 目标字符串
返回值:匹配内容match object
"""
rs = re.search(r'abcd', "zzzabcdzzzabcdzzzz")
print(rs) # <re.Match object; span=(3, 7), match='abcd'>
print(rs.group()) # abcd
3.正则表达式分组
正则表达式中,以()内部为分组,()内部的()为子组
m = re.search(r"(ab)cd(?P<pig>ef)", 'abcdefgh')
print(m.group()) # abcdef
print(m.group(1)) # ab
print(m.group(2)) # ef
"""
group(index = 0)
返回对应分组序列匹配到的内容
默认index = 0 返回整个match对象内容
"""
print(m.group('pig')) # ef
"""
group(group_name)
返回组名为group_name匹配到的内容
"""
print(m.groups()) # ('ab', 'ef')
"""
groups() 获取所有子组对应的内容
"""
4.贪婪模式和非贪婪模式
贪婪模式:就是尽可能多的匹配后面的内容
非贪婪模式:尽可能少的匹配后面的内容
pattern1 = r"(http://|https://).+(com|cn)"
pattern2 = r"(http://|https://).+?(com|cn)"
miter = re.finditer(pattern1, "http://www.aaa.com,https://www.bbb.cn")
for m in miter:
print(m.group())
# http://www.aaa.com,https://www.bbb.cn
miter = re.finditer(pattern2, "http://www.aaa.com,https://www.bbb.cn")
for m in miter:
print(m.group())
# http://www.aaa.com
# https://www.bbb.cn
在元字符后面加上? 就可以将贪婪模式转为非贪婪模式
5.flag参数
A == ASCII 元字符只能匹配ascii码
I == IGNORECASE 匹配忽略字母大小写
S == DOTALL 使 . 可以匹配换行
M == MULTILINE 使 ^ $可以匹配每一行的开头结尾位置
s = """Hello
张三
"""
# 只能匹配ascii编码
regex = re.compile(r'\w+', flags=re.A)
rs = regex.findall(s)
print(rs) # ['Hello']
regex = re.compile(r'\w+')
rs = regex.findall(s)
print(rs) # ['Hello', '张三']
# 忽略字母大小写
regex = re.compile(r'hello', flags=re.I)
rs = regex.findall(s)
print(rs) # ['Hello']
regex = re.compile(r'hello')
rs = regex.findall(s)
print(rs) # []
# . 可以匹配换行
regex = re.compile(r'.+', flags=re.S)
rs = regex.findall(s)
print(rs) # ['Hello\n张三\n']
regex = re.compile(r'.+')
rs = regex.findall(s)
print(rs) # ['Hello', '张三']
# ^ $可以匹配每行开头结尾
regex = re.compile(r'^张三', flags=re.M)
rs = regex.findall(s)
print(rs) # ['张三']
regex = re.compile(r'^张三')
rs = regex.findall(s)
print(rs) # []