import re
str = "Iss study Python3.6 Everyday"
# 1. ^ :开头
result = re.match("^I",str) # I
print(result.group())
# 2. . : 任意字符
result = re.match("^I.",str) # Is
print(result.group())
# 3. * :0/1/多个【前】一个字符
result = re.match("^Is*",str) # Iss
print(result.group())
# 4. ? : 非贪婪
# .* 可以为空或字符串
# group() 用来提出分组截获的字符串,括号()用来分组
# group() = group(0) pccccccccccccppeng123
str1 = "pccccccccccccppeng123"
result1 = re.match(".*(p.*p).*",str1) # 贪婪 (从右到左)
print(result1.group(1)) # pp
result2 = re.match(".*?(p.*p).*",str1) # 非贪婪(从左到右,第一个符合条件)
print(result2.group(1)) # pccccccccccccpp
result3 = re.match(".*?(p.*?p).*",str1)
print(result3.group(1)) # pccccccccccccp
str2 = "pcccpccccccccppeng123"
result3 = re.match(".*?(p.*?p).*",str2)
print(result3.group(1)) # pcccp
result4 = re.match(".*(p.*?p).*",str2)
print(result4.group(1)) # pp
result5 = re.match(".*?(p.*p).*",str2)
print(result5.group(1)) # pcccpccccccccpp
# 5. {1} {1,,} {2,5} 限定字符个数
str3 = "dccpccpapbbbbpeng123"
result6 = re.match(".*(p.{1}p).*",str3) # p与p中间只有一个字符
print(result6.group(1)) # pap
result6 = re.match(".*(p.{2}p).*",str3) # p与p之间只有2个字符
print(result6.group(1)) # pccp
result6 = re.match(".*(p.{3,}p).*",str3) # p与p之间有3个及以上字符
print(result6.group(1)) # pbbbbp
result6 = re.match(".*(p.{1,3}p).*",str3) # p与p之间有1到3个字符
print(result6.group(1)) # pap
# 6. | : 或
str4 = "dcpeng123"
result6 = re.match("(dcpeng|dcpeng123)",str4)
print(result6.group(1)) # dcpeng
result6 = re.match("(dcpeng123|dcpeng)",str4)
print(result6.group(1)) # dcpeng123
result6 = re.match("(dcpeng1234|dcpeng)",str4)
print(result6.group(1)) # dcpeng
result6 = re.match("(dcpeng|dcpeng123)123",str4)
print(result6.group(1)) # dcpeng
result6 = re.match("(dcpeng1234|dcpeng123)",str4)
print(result6.group(1)) # dcpeng123
result6 = re.match("((dcpeng|dcpeng123)123)",str4)
# dcpeng123 最外面的括号是group(1) 里面的括号是group(2)
# group(1) 以123匹配到depeng123 ,所以是depeng123
# group(2) 以(dcpengsss|dcpeng)123这个区匹配,所以是dcpeng
print("re",result6.group(1))
result6 = re.match("((dcpengsss|dcpeng)123)",str4)
print("re",result6.group(2)) # dcpeng
result6 = re.match("((dcpengs|dcpen)123)",str4)
# print("re",result6.group(2)) # result6 为 None
# 7、 [] : 满足括号中的任意一个字符即可
str5 = "dcpeng123"
result7 = re.match("([abcd]cpeng12)",str5)
print(result7.group(1)) # dcpeng12
result7 = re.match("([abc]cpeng12)",str5)
# print(result7.group(1)) # None
str5 = "13955696026"
result7 = re.match("(1[3458][0-9]{9})",str5)
print(result7.group(1)) # 13955692026
result7 = re.match("(1[7458][0-9]{9})",str5)
# print(result7.group(1)) # None
# 这里^不是开头的意思,是取反的意识
result7 = re.match("(1[3458][^1]{9})",str5)
print(result7.group(1)) # 13955696026
result7 = re.match("(1[3458][^0]{9})",str5)
# print(result7.group(1)) # None
str5 = "aaabhshabsa"
result7 = re.match(".*(b[a-z]{2})",str5) # ()中不能用^ (^b[a-z]{2})是错误的
print("sss",result7.group(1)) # bsa
注意:
一、[]中括号中的任意一个字符,如[abcd],代表a、b、c、d这四个字符中的任意一个。
二、表示区间,如[0-9],代表数字0到9中的任意一个。同理[a-z],[A-Z]
三、[^]表示非或者取反,如匹配模式[^1]表示匹配的字符不为1。
四、[.]或[*]就是纯粹的代表“.”号和“*”号,不再是代表特殊字符中代表的任意字符或出现多次的意思,这点需要特别注意。
# 8、 \s : 空格 \S : 非空格
str6 = "加 油"
result8 = re.match("(加\s油)",str6)
print(result8.group(1)) # 加 油 一个空格
result8 = re.match("(加\s+油)",str6)
print(result8.group(1)) # 加 油 + 表示1个或多个空格
str6 = "加加油"
result8 = re.match("(加\S油)",str6)
print(result8.group(1)) # 加加油 \S 只有一个非空格
result8 = re.match("(加\S+油)",str6)
print(result8.group(1)) # 加加油 \S 一个或多个非空格
# 9、 \w : 表示0-9、a-z、A-Z和_中的任意字符
# \W : 表示除去0-9a-zA-Z和_
str7 = "努a力"
result9 = re.match("(努[0-9a-zA-Z_]力)",str7)
print(result9.group(1)) # 努a力
result9 = re.match("(努\w力)",str7)
print(result9.group(1)) # 努a力
str7="努w力"
result9 = re.match("(努\w力)",str7)
print(result9.group(1)) # 努a力
str7="努_力"
result9 = re.match("(努\w力)",str7)
print(result9.group(1)) # 努a力
result9 = re.match("(努-力)",str7)
if result9:
print(result9.group(1)) # 努a力
else:
print("无")
str7 = "努#力"
result9 = re.match("(努\W力)",str7)
print(result9.group(1)) # 努#力
# 10、[\u4E00-\u9FA5]: 汉字
str8 = "加油"
result10 = re.match("([\u4E00-\u9FA5])",str8)
print(result10.group(1)) # 加 默认匹配一个汉字
result10 = re.match("([\u4E00-\u9FA5]+)",str8)
print(result10.group(1)) # 加油
str8 = "加a油"
result10 = re.match("([\u4E00-\u9FA5]+)",str8)
print(result10.group(1)) # 加
str8 = "加油a"
result10 = re.match("([\u4E00-\u9FA5]+)",str8)
print(result10.group(1)) # 加油
str8 = "加 油a"
result10 = re.match("([\u4E00-\u9FA5]+)",str8)
print(result10.group(1)) # 加
str8 = "XXX gradutes from 清华大学"
result10 = re.match(".*?([\u4E00-\u9FA5]+大学)",str8) # 非贪婪,从左边开始
print(result10.group(1)) # 清华大学
str8 = "XXX gradutes from 清华大学"
result10 = re.match(".*([\u4E00-\u9FA5]+大学)",str8) # 非贪婪,从左边开始
print(result10.group(1)) # 华大学 贪婪,从右边到左边
# 11、 \d : 数字
str9 = "xxx出生于1995年"
result11 = re.match(".*(\d+)年",str9)
print(result11.group(1)) # 5 \d+ 表示多个数字 不是1995,原因是贪婪模式
result11 = re.match(".*?(\d+)年",str9)
print(result11.group(1)) # 1995
result11 = re.match(".*(\d{4})年",str9)
print(result11.group(1)) # 1995 这样也可以的