import re
# findall
# search
# match
# 1. findall : 返回所有满足条件的结果,放在列表中
ret = re.findall('[a-z]+','abc def z')
print(ret) # 打印结果:['abc', 'def', 'z']
# 2. search : 从前往后,找到一个就返回,返回的变量需要调用 group 才能拿到结果
# 如何没有找到,就返回 None ,调用 group 的话会报错
ret = re.search('a','abc def z')
print(ret.group()) # 打印结果:a
# 3. match : 从头开始匹配,如果正则规则从头开始可以匹配上,就返回一个变量,
# 匹配的内容需要 group 才能显示
# 如何没有匹配结果,返回None ,调用 group 会报错
ret = re.match('[a-z]+','abc def z')
if ret:
print(ret.group()) # 打印结果:abc
# 4. split() # 分割
ret = re.split('[ab]','abcd')
# 先按 'a' 分割得到 '' 和 'bcd' ,在对 '' 和 'bcd' 分别按 'b' 分割
print(ret) # 打印结果:['', '', 'cd']
# 5. sub() # 用于替换字符串中的匹配项
# 最后一个参数是替换的个数,不写的话默认全替换
ret = re.sub('\d','H','abc1d2e3',1) # 将 字符中的数字替换成 H
print(ret) # 打印结果:abcHd2e3
# 5.1 subn() # 与 sub 一样,但是会返回一个替换几次的结果
ret = re.subn('\d','H','abc1d2e3',1) # 将 字符中的数字替换成 H
print(ret) # 打印结果:('abcHd2e3', 1)
# 6. compile() # 将正则表达式编译成一个正则表达式对象
obj = re.compile('\d{3}')
# 将 正则表达式编译成一个 正则表达式对象,规则:要匹配的是三个数字
ret = obj.search('abc123sdfssdf')
print(ret.group()) # 打印结果 : 123
# 7. finditer() # 返回一个迭代器
ret = re.finditer('\d','k1j23lj34ql')
print(ret) # 打印结果:<callable_iterator object at 0x000001ADBCE95B38>
print(next(ret).group()) # 打印结果: 1 # 查看第一个结果
print(next(ret).group()) # 打印结果: 2 # 查看第二个结果
print([i.group() for i in ret]) # 打印结果: ['3', '3', '4'] # 查看剩余结果
# 8. ?: # 取消分组优先
# 无分组的 findall()
ret = re.findall('www.(baidu|taobao).com','www.baidu.com')
print(ret) # 打印结果 : ['baidu']
# 有分组的 findall()
ret = re.findall('www.(?:baidu|taobao).com','www.baidu.com')
print(ret) # 打印结果 : ['www.baidu.com']
# findall()
# -------------------- --------- -------------- -----------
# split()
# 无分组的 split()
ret = re.split('\d+','asdg332sgdt89daf')
print(ret) # 打印结果:['asdg', 'sgdt', 'daf']
# 有分组的 split()
ret = re.split('(\d+)','asdg332sgdt89daf')
print(ret) # 打印结果:['asdg', '332', 'sgdt', '89', 'daf']
# 命名: ?P<q> --- 'q'
ret = re.search('\d(?P<q>\w+)','asd123zxc43t')
print(ret.group('q'))
# ? 三种用法:
# 1. 在 量词 中:匹配 零次 或 一次
# 2. 在 量词 后面:惰性匹配的标志
# 3. 在 分组 第一个加 (?:abc\asd) : 取消分组优先