Python学习之路15——Re正则模块

   学了正则模块后,一直没有相关记录,导致很多知识点很快就忘了,囧。。。今天下决心还是补上欠的账。

一、re模块基本用法

  re模块用于对Python的正则表达式的操作,用来模糊匹配字符串。

 1 '.'     默认匹配除\n之外的任意一个字符,若指定flag DOTALL,则匹配任意字符,包括换行
 2 '^'     匹配字符开头,若指定flags MULTILINE,这种也可以匹配上(r"^a","\nabc\neee",flags=re.MULTILINE)
 3 '$'     匹配字符结尾,或e.search("foo$","bfoo\nsdfsf",flags=re.MULTILINE).group()也可以
 4 '*'     匹配*号前的字符0次或多次,re.findall("ab*","cabb3abcbbac")  结果为['abb', 'ab', 'a']
 5 '+'     匹配前一个字符1次或多次,re.findall("ab+","ab+cd+abb+bba") 结果['ab', 'abb']
 6 '?'     匹配前一个字符1次或0次
 7 '{m}'   匹配前一个字符m次
 8 '{n,m}' 匹配前一个字符n到m次,re.findall("ab{1,3}","abb abc abbcbbb") 结果'abb', 'ab', 'abb']
 9 '|'     匹配|左或|右的字符,re.search("abc|ABC","ABCBabcCD").group() 结果'ABC'
10 '(...)' 分组匹配,re.search("(abc){2}a(123|456)c", "abcabca456c").group() 结果 abcabca456c
11 '[a-z]' 匹配a到z任意一个字符
12 '[^()]' 匹配除()以外的任意一个字符
13   
14 r' '    转义引号里的字符 针对\字符  详情查看⑦
15 '\A'    只从字符开头匹配,re.search("\Aabc","alexabc") 是匹配不到的
16 '\Z'    匹配字符结尾,同$
17 '\d'    匹配数字0-9
18 '\D'    匹配非数字
19 '\w'    匹配[A-Za-z0-9]
20 '\W'    匹配非[A-Za-z0-9]
21 '\s'    匹配空白字符、\t、\n、\r , re.search("\s+","ab\tc1\n3").group() 结果 '\t'
22     
23 '(?P<name>...)' 分组匹配 re.search("(?P<province>[0-9]{4})(?P<city>[0-9]{2})(?P<birthday>[0-9]{4})","371481199306143242").groupdict("city")
24 结果{'province': '3714', 'city': '81', 'birthday': '1993'}
25 re.IGNORECASE  忽略大小写 re.search('(\A|\s)red(\s+|$)',i,re.IGNORECASE)

   实例展示如下:

 1 #!/user/bin/env ptyhon
 2 # -*- coding:utf-8 -*-
 3 # Author: VisonWong
 4 
 5 
 6 import re
 7 
 8 #'.'用法:默认匹配除\n之外的任意一个字符
 9 res = re.search('.','Vison123Wong321').group()
10 print(res)
11 #V
12 res = re.search('.','Wong321').group()
13 print(res)
14 #W
15 
16 #'^'用法:匹配字符开头,注意必须是字符串的开头
17 res = re.search('^Vison','Vison123Wong321').group()
18 print(res)
19 #V
20 res = re.search('^V','Wong321')
21 print(res)
22 #None
23 #没有匹配到结果,强调必须是匹配整个字符串的开头,而不是你想匹配某一个片段的开头
24 
25 #'$'用法:匹配字符结尾,注意必须是字符串的结尾
26 res = re.search('Wong321$','Vison123Wong321').group()
27 print(res)
28 #Wong321
29 res = re.search('Wong$','Vison123Wong321')
30 print(res)
31 #None
32 #没有匹配到结果,强调必须是匹配整个字符串的结尾,而不是你想匹配某一个片段的结尾
33 
34 #'*'用法:匹配*号前的字符0次或多次,如ab*其实可以匹配到a,ab,abb,abbb....
35 res = re.findall("ab*","cabb3abcbbac")
36 print(res)
37 # ['abb', 'ab', 'a']
38 #注意表示形式:ab*只是匹配*前b0次或多次,(ab)*则是匹配*前(ab)0次或多次
39 
40 #'+'用法:匹配+号前的字符1次或多次,如ab+其实可以匹配到ab,abb,abbb....
41 res = re.findall("ab+","ab+cd+abb+bba")
42 print(res)
43 # ['ab', 'abb']
44 #注意表现形式:ab+只是匹配+前b1次或多次,(ab)+则是匹配+前(ab)1次或多次
45 
46 # '?'用法:匹配?号前一个字符1次或0次,如ab?其实可以匹配到a,ab。
47 res = re.findall("ab?","ab+cd+abb+bba")
48 print(res)
49 #['ab', 'ab', 'a']
50 #注意表现形式:ab?只是匹配?前b1次或0次,(ab)?则是匹配?前(ab)1次或0次
51 
52 #'{m}'用法:匹配前一个字符m次,如ab{3}可以匹配到abbb.
53 res = re.search("ab{3}","cdabbb+bba").group()
54 print(res)
55 #abbb
56 
57 #{n,m}用法:匹配前一个字符n到m次,如ab{1,3}可以匹配到ab,abb,abbb。
58 res = re.findall("ab{1,3}","ab+fg+abbbv*abb")
59 print(res)
60 # ['ab', 'abbb', 'abb']
61 
62 #'|'用法:匹配|左或|右的字符,
63 res = re.search("abc|ABC","ABCBabcCD").group()
64 print(res)
65 # ABC
66 
67 #'[a-z]'用法:匹配a到z任意一个字符
68 res = re.search("[a-z]+","34fsdgdfg76").group()
69 print(res)
70 # fsdgdfg
71 
72 #'[^()]'用法:匹配除()以外的任意一个字符
73 res = re.search("[^()]+","%*%$34fsdgdfg76").group()
74 print(res)
75 # %*%$34fsdgdfg76

  标志位即模式修正符,不改变正则表达式的情况下,通过模式修正符改变正则表达式的含义,从而实现一些匹配结果的调整等功能:

1 # flags
2 I = IGNORECASE = sre_compile.SRE_FLAG_IGNORECASE # ignore case  匹配时忽略大小写
3 L = LOCALE = sre_compile.SRE_FLAG_LOCALE # assume current 8-bit locale   做本地化识别匹配
4 U = UNICODE = sre_compile.SRE_FLAG_UNICODE # assume unicode locale       根据Unicode字符及解析字符
5 M = MULTILINE = sre_compile.SRE_FLAG_MULTILINE # make anchors look for newline   多行匹配
6 S = DOTALL = sre_compile.SRE_FLAG_DOTALL # make dot match newline      让.匹配包括换行符,即用了该模式修正后,"."匹配就可以匹配任意的字符了
7 X = VERBOSE = sre_compile.SRE_FLAG_VERBOSE # ignore whitespace and comments

二、

猜你喜欢

转载自www.cnblogs.com/visonwong/p/9168553.html