正则表达式 re模块

2019-12-04

# 正则表达式:python1.5后增加了re模块,提供了正则表达式模式,re模块使python语言拥有了全部的正则表达式的功能

re函数

import re
'''
re.match()函数:
原型:match(pattern,string,flags=0);
参数:pattern:匹配的正则表达式,
string:受匹配的字符串,
flags:标志位,用于控制正则表达式的匹配方式(
re.I(忽略大小写)常用
re.L(做本地化识别)一般不用
re.M(多行匹配),影响^和$
re.S(使.匹配包括换行符在内的所有字符)常用
re.U(根据Unicode字符集解析字符,影响\w \W \b \W)
re.X(以更灵活的格式理解正则表达式));
功能:尝试从字符串的起始位置匹配一个模式。如果不是起始位置匹配成功的话,也会返回None,
'''

# 网址:是不是以www开头的
print(re.match("www","www.baidu.com"))
print(re.match("www","www.baidu.com").span())
print(re.match("www","Www.baidu.com"))
print(re.match("www","Www.baidu.com",flags=re.I))

'''
re.search()函数
原型:search(pattern,string,flags=0);
参数:pattern:匹配的正则表达式,
string:受匹配的字符串,
flags:标志位,用于控制正则表达式的匹配方式
功能:扫描整个字符串并返回第一个成功的匹配
'''
print(re.search("sunck","good man is sunck!sunck is nice"))

'''
re.findall()
原型:findall(pattern,string,flags=0);
参数:pattern:匹配的正则表达式,
string:受匹配的字符串,
flags:标志位,用于控制正则表达式的匹配方式
功能:扫描整个字符串并返回结果列表
'''
print(re.findall("sunck","good man is sunck!sunck is nice"))

re模块深入

字符串切割
str1 = "sunck is a good man"
print(re.split(r" +",str1))

'''
re.finditer():
原型:finditer(pattern,string,flags=0);
参数:pattern:匹配的正则表达式,
string:受匹配的字符串,
flags:标志位,用于控制正则表达式的匹配方式
功能:与findall类似,扫描整个字符串,返回的是一个迭代器
'''

str2 = "sunck is a good man!sunck is anice man!sunck is a handsome man"
d = re.finditer(r"(sunck)",str2)
while True:
    try:
        l = next(d)
        print(d)
        print(l)
    except StopIteration as e:
        break
字符串的替换和修改
'''
re.sub(pattern,repl,string,count=0,flags=0)
re.subn(pattern,repl,string,count=0,flags=0)
参数:pattern:匹配的正则表达式,
repl:指定的用来替换的字符串
string:目标字符串,
count:最多替换次数
flags:标志位,用于控制正则表达式的匹配方式
功能:在目标字符串中,以正则表达式的规则匹配字符串,再把他们替换成指定的字符串,可以指定替换的次数,如果不指定,他会替换所有的匹配字符串
sub和subn的区别:sub返回被替换的字符串,subn返回的是一个元组,第一个元素是被替换你的字符串,第二个是被替换的次数
'''
str3 = "sunck is a good good good man"
print(re.sub(r"(good)","nice",str3))
print(type(re.sub(r"(good)","nice",str3)))
print(re.subn(r"(good)","nice",str3))
print(type(re.subn(r"(good)","nice",str3)))
分组:除了简单的判断是否匹配之外,正则表达式还有提取字符串的功能,用()表示就是提取分组
str4 = "010-12345678"
m = re.match(r"(?P\d{3})-(?P\d{8})",str4)
print(m)
# 使用序号获取对应组的信息;0代表的是原始字符串,1代表第一组括号中提取信息,2代表第二组括号中提取的信息
print(m.group(0))
# 查看匹配的各组的情况
print(m.groups())
# ?p<>是给正则表达式起名字,group可以通过名字提取数据
print(m.group("first"))

注:当我们使用正则表达式时,re模块会干两件事

1、编译正则表达式,如果正则表达式本身不合法,会报错

2、用编译后的正则表达式去匹配对象

re.compile(pattern,flags=0)
pattern:要编译的正则表达式

pat = r"^1(([3578]\d)|(47))\d{8}$"
# 编译成一个正则对象
print(re.match(pat,"13600001111"))
re_telephon = re.compile(pat)
print(re_telephon.match("13600001111"))

 

{/if}