正则表达式

 

 

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  这样也可以的

 

 

 

 

posted @ 2019-01-22 18:03  fangsheng420  阅读(132)  评论(0编辑  收藏  举报