python3正则表达式与re模块
re模块
re模块是python提供的专门用来支持正则表达式的一个模块
fullmatch函数:fullmatch(正则表达式,字符串) — 让正则表达式与指定字符串进行完全匹配,匹配失败返回None
正则语法
正则表达式 — 正则表达式是让一个字符串复杂问题变得简单的工具
写正则表达式的主要工作:用正则符号描述清楚相关字符串的规则
python正则表示方式:r’正则表达式’
re模块相关函数
-
compile(正则表达式) — 编译正则表达式,返回一个正则表达式对象
正则表达式对象.fullmatch(字符串)
re_obj = re.compile(r'(\d{3})-([A-Z])')
result = re_obj.fullmatch('999-Z')
print(result)
-
fullmatch(正则表达式,字符串) — 让正则表达式和整个字符串进行匹配(完全匹配),匹配失败返回None,成功
返回匹配对象
match(正则表达式,字符串) — 匹配字符串开头(判断字符串开头是否满足正则表达式),匹配失败返回None,
成功返回匹配对象
匹配对象:
a)、获取匹配到的字符串
1.匹配对象.group() / 匹配对象.group(0) — 获取整个正则匹配到的结果
2.匹配对象.group(N) — 获取第N个分组匹配到的结果
b)、获取匹配结果在原字符串中的位置信息
匹配对象.span() — 返回的是一个元组,元组中的元素是开始下标和结束下标,结束下标对应的位置取不到
例:(3,6)表示3,4,5
匹配对象.span(N)
print(result.group()) #999-Z print(result.group(1)) #999 print(result.group(2)) #Z print(result.span()) print(result.span(1))
-
search(正则表达式,字符串) — 获取字符串第一个满足正则表达式的子串;返回结果是None或匹配对象
result = re.search(r'(\d{2})\D','15大萨达156阿萨德68无法6546是非得失28sdsa') print(result) print(result.group())
-
findall(正则表达式,字符串) — 获取字符串中所有满足正则的子串,返回的是列表,列表中的元素是子串(无分组时)
如果正则中只有一个分组:返回的列表中的元组是每个分组匹配到的结果
如果正则中有两个或两个以上的分组:返回的列表中的元素是元组,元组中的元素是每个分组匹配到的结果
result = re.findall(r'\d{2}','15大萨达156阿萨德68无法6546是非得失28sdsa')
print(result)
# 截取 一个分组
result1 = re.findall(r'(\d{2})\D','15大萨达156阿萨德68无法6546是非得失28sdsa')
print(result1)
-
finditer(正则表达式,字符串) — 获取字符串中所有满足正则的子串,返回的是一个迭代器,迭代器是匹配结
果(多分组时)
result1 = re.finditer(r'(\d{2})-([a-z]{3})','99-zzx理解科技馆11-jlk黄金鸡块')
r1 = next(result1)
print(r1,r1.group(),r1.group(1),r1.group(2))
-
split(正则表达式,字符串) — 将字符串中所有满足正则表达式的子串作为切割点,对字符串进行切割
split(正则表达式,字符串,N) — 将字符串中前N个所有满足正则表达式的子串作为切割点,对字符串进行切
割
result2 = re.split(r'\d+','沙发上5非常撒啊67高的6sfsa8撒放')
print(result2) #['沙发上', '非常撒啊', '高的', 'sfsa', '撒放']
result2 = re.split(r'\d+','沙发上5非常撒啊67高的6sfsa8撒放',3)
print(result2) #['沙发上', '非常撒啊', '高的', 'sfsa8撒放']
-
sub(正则表达式,字符串1,字符串2) — 将字符串2中所有满足正则表达式的子串替换为字符串1
sub(正则表达式,字符串1,字符串2) — 将字符串2中前N个所有满足正则表达式的子串替换为字符串1
result2 = re.sub(r'(?i)\d|sb','*','沙发上5非常SB撒啊67高的6sfsa8撒放') #(?i) --- 忽略大小写
print(result2) #沙发上*非常*撒啊**高的*sfsa*撒放
-
flags参数
上述(1-7)没一个函数都有一个参数flags,用来设置正则参数
1)、单行匹配和多行匹配参数:re.S、re.M(默认)
单行匹配:"."可匹配\ n
多行匹配:"."不能匹配\ n
flags = re.S <==> r’(?s)正则表达式’
2)、忽略大小写:re.I
flags = re.I <==> r’(?i)正则表达式’
3)、多参数
flags = re.S|re.I <==> (?is) / (?si)
# re.S & re.M
print(re.fullmatch(r'z.x','z\nx',flags=re.M)) #None
print(re.fullmatch(r'z.x','z\nx',fla