re 模块
常用的表達式規則
'.' 默認匹配除\n之外的任意一個字符,若指定flag DOTALL,則匹配任意字符,包括換行 '^' 匹配字符開頭,若指定flags MULTILINE,這種也可以匹配上(r"^a","\nabc\neee",flags=re.MULTILINE) '$' 匹配字符結尾, 若指定flags MULTILINE ,re.search('foo.$','foo1\nfoo2\n',re.MULTILINE).group() 會匹配到foo1 '*' 匹配*號前的字符0次或多次, re.search('a*','aaaabac') 結果'aaaa' '+' 匹配前一個字符1次或多次,re.findall("ab+","ab+cd+abb+bba") 結果['ab', 'abb'] '?' 匹配前一個字符1次或0次 ,re.search('b?','alex').group() 匹配b 0次 '{m}' 匹配前一個字符m次 ,re.search('b{3}','alexbbbs').group() 匹配到'bbb' '{n,m}' 匹配前一個字符n到m次,re.findall("ab{1,3}","abb abc abbcbbb") 結果'abb', 'ab', 'abb'] '|' 匹配|左或|右的字符,re.search("abc|ABC","ABCBabcCD").group() 結果'ABC' '(...)' 分組匹配, re.search("(abc){2}a(123|45)", "abcabca456c").group() 結果為'abcabca45''\A' 只從字符開頭匹配,re.search("\Aabc","alexabc") 是匹配不到的,相當于re.match('abc',"alexabc") 或^ '\Z' 匹配字符結尾,同$ '\d' 匹配數字0-9 '\D' 匹配非數字 '\w' 匹配[A-Za-z0-9] '\W' 匹配非[A-Za-z0-9] '\s' 匹配空白字符、\t、\n、\r , re.search("\s+","ab\tc1\n3").group() 結果 '\t''(?P<name>...)' 分組匹配>>>re.search("(?P<province>[0-9]{4})(?P<city>[0-9]{2})(?P<birthday>[0-9]{4})","371481199306143242").groupdict("city")
>>>a.groupdict() {'province': '3714', 'city': '81', 'birthday': '1993'}
re的匹配語法有以下幾種
- re.match 從頭開始匹配
- re.search 匹配包含
- re.findall 把所有匹配到的字符放到以列表中的元素返回
- re.split 以匹配到的字符當做列表分隔符
- re.sub 匹配字符并替換
- re.fullmatch 全部匹配
re.compile(pattern, flags=0)
將正則表達式模式編譯為正則表達式對象,該對象可用于使用match(),search()和其他方法進行匹配,如下所述
The sequenceprog = re.compile(pattern) result = prog.match(string) is equivalent toresult = re.match(pattern, string)如果在單個程序中多次使用表達式,則使用re.compile()并保存生成的正則表達式對象以便重用將會更有效。
re.match(pattern, string, flags=0)
從起始位置開始根據模型去字符串中匹配指定內容,匹配單個
- pattern 正則表達式
- string 要匹配的字符串
- flags 標志位,用于控制正則表達式的匹配方式
Flags標志符
- re.I(re.IGNORECASE): 忽略大小寫(括號內是完整寫法,下同)
- M(MULTILINE): 多行模式,改變'^'和'$'的行為
- S(DOTALL): 改變'.'的行為,make the '.' special character match any character at all, including a newline; without this flag, '.' will match anything except a newline.
- X(re.VERBOSE) 可以給你的表達式寫注釋,使其更可讀,下面這2個意思一樣
re.search(pattern, string, flags=0)
根據模型去字符串中匹配指定內容,匹配單個
1 import re 2 obj = re.search('\d+', 'u123uu888asf') 3 if obj: 4 print obj.group()re.findall(pattern, string, flags=0)
?match and search均用于匹配單值,即:只能匹配字符串中的一個,如果想要匹配到字符串中所有符合條件的元素,則需要使用 findall。
1 import re 2 obj = re.findall('\d+', 'fa123uu888asf') 3 print obj?re.sub(pattern, repl, string, count=0, flags=0)
用于替換匹配的字符串
>>> s = '21fasdf32' >>> re.sub('\d+','_',s) '_fasdf_' >>> re.sub('\d+','_',age) 'lemi_kevin_alex_|python\\linux' >>> re.sub('\d+','_',age,count=2) 'lemi_kevin_alex33|python\\linux' >>> s='9-2*5/3+7/3*99/4*2998+10*568/14'相比于str.replace功能更加強大?
?re.split(pattern, string, maxsplit=0, flags=0)
>>> age = 'lemi21kevin22alex33' >>> re.split('\d+',age) ['lemi', 'kevin', 'alex', ''] >>> age = 'lemi21kevin22alex33|python\linux' >>> re.split('\|',age) ['lemi21kevin22alex33', 'python\\linux'] >>> re.split('\\\\',age) ['lemi21kevin22alex33|python', 'linux'] >>> re.split('[-\*/+]',s) ['9', '2', '5', '3', '7', '3', '99', '4', '2998', '10', '568', '14'] >>> re.split('[-\*/+]',s,maxsplit=2) ['9', '2', '5/3+7/3*99/4*2998+10*568/14']?re.fullmatch(pattern, string, flags=0)
整個字符串匹配成功就返回re object, 否則返回None
>>> pattern = re.compile('\w+@\w+\.(cn|com|org)') >>> pattern.fullmatch('fadewalk@163.com').group() 'fadewalk@163.com'總結
- 上一篇: python的6种基本数据类型--字典
- 下一篇: random 模块