"""
re的其他函数:
re.split(patter,str) 将str以patter的匹配形式切割并返回list
re.finditer(patter,str) 作用和findall一样,但findall返回的是列表,finditer返回的是迭代器
re.sub(pattern, repl, string, count=0, flags=0)
re.subn(pattern, repl, string, count=0, flags=0)
rep1:替换的字符串
count: 替换次数
功能,用正则表达式的规则匹配字符串,并以rep1进行指定次数替换
区别:sub()返回字符串,subn()返回以替换完后的字符串和替换次数位元素的tuple
"""
print("-------------------------")
str = "I am a man"
print(re.split(" +",str))
print(re.finditer("hj","hj hj hj dfs"))
print(re.sub(r"a","v",str))
print(re.subn(r"a","v",str))
"""
分组:除了简单的判断是否匹配之外,正则表达式还有提取子串的功能。用()表示的就是提取分组
(?P<str> ) 对这个组以str为命名
_sre.SRE_Match.group(int/str) 根据序号或者组名获取对应组的信息
_sre.SRE_Match.groups() 获取所有组的信息
"""
print("-------------------------")
str = "0075-27800075"
m = re.match(R"(?P<h>d{4})-(d{8})",str)
print(m)
print(m.group(0))
print(m.group(1))
print(m.group("h"))
print(m.group(2))
# print(m.group(3)) #报错,因为正则中的规则一共3个组,不存在第四个组
print(m.groups())
"""
正则表达式的实现过程:
当我们写完re.match(pattern,str,[flag])等函数使用正则表达式时,程序时先对pattern和flag进行编译,等编译好后再去匹配str字符串
为了减少代码量,我们可以先对pattern和flag进行编译封装起来,等使用时再拿出来匹配对应str字符串,格式如下:
变量 = re.compile(pattern,flags) #变量的type为_sre.SRE_Pattern
变量.findall(str) #这个变量可以调用re的的match,search,findall,finditer,sub,subn等函数
这种形式跟创建正则函数是一样的,只是函数需要创建和调用,相比之下,函数的代码量会多一些
"""
print("--------------------")
patter = "^d{6,8}$"
re_User = re.compile(patter)
print(re_User.match("123456789")) #返回对象
print(re_User.match("123457")) #返回None
"""
QQ 4位-13位纯数字
mail
password 包含数字字母(大小写)特殊字符
ip地址
"""
def checkQQ(str):
patter = "^d{4,13}$"
return re.match(patter,str)
def checkEmail(str):
patter = "^[0-9a-z]*@[0-9a-z]*.com$"
return re.match(patter,str)
checkPassword = re.compile("^(d+|[a-z]+|[A-Z]+){6,15}$")
checkIp=re.compile("(d{1,2}|[1]d{1,2}|[2][0-5][0-5]).(d{1,2}|[1]d{1,2}|[2][0-5][0-5])."
"(d{1,2}|[1]d{1,2}|[2][0-5][0-5]).(d{1,2}|[1]d{1,2}|[2][0-5][0-5])")
print(checkQQ("1234567891111")) #返回对象
print(checkEmail("hjl@afr.com")) #返回对象
print(checkPassword.match("1ADsd123456")) #返回对象
print(checkIp.match("256.1.99.0")) #返回None