re正則模塊
一:什么是正則景埃?
正則就是用一些具有特殊含義的符號組合到一起(稱為正則表達式)來描述字符或者字符串的方法崖疤⊙龉冢或者說:正則就是用來描述一類事物的規(guī)則。(在Python中)它內(nèi)嵌在Python中轻腺,并通過 re 模塊實現(xiàn)乐疆。正則表達式模式被編譯成一系列的字節(jié)碼,然后由用 C 編寫的匹配引擎執(zhí)行贬养。
生活中處處都是正則:
? 比如我們描述:4條腿
? 你可能會想到的是四條腿的動物或者桌子挤土,椅子等
? 繼續(xù)描述:4條腿,活的
? 就只剩下四條腿的動物這一類了
二:常用匹配模式(元字符)
1036857-20170529203214461-666088398-1.jpg
匹配模式
一對一匹配
print('hello'.replace('h','qw'))
# qwello
print('hello'.find('lo'))
# 3 # 匹配到的位置
正則匹配
import re
h="""hello alex 66"""
# \w 匹配字母數(shù)字及下劃線
# \W 匹配非字母數(shù)字下劃線
print(re.findall('\w',h))
> ['h', 'e', 'l', 'l', 'o', 'a', 'l', 'e', 'x', '6', '6', '6']
print(re.findall('\W',h))
> [' ', ' ']
# \s 匹配任意空白字符误算,等價于[\t\n\r\f]
# \S 匹配任意非空字符
print(re.findall('\s',h))
print(re.findall('\S',h))
print(re.findall('\s','hello \n alex \t 666\\n'))
> [' ', ' ']
> ['h', 'e', 'l', 'l', 'o', 'a', 'l', 'e', 'x', '6', '6', '6']
> [' ', '\n', ' ', ' ', '\t', ' '] #\n \t都可以被\s匹配 \\ 表示轉(zhuǎn)義
# \d 匹配任意數(shù)字仰美,等價于[0-9]
# \D 匹配任意非數(shù)字
print(re.findall('\d',h))
print(re.findall('\D',h))
> ['6', '6', '6']
> ['h', 'e', 'l', 'l', 'o', ' ', 'a', 'l', 'e', 'x', ' ']
# \A 匹配字符串開始
# \z 匹配字符串結(jié)束
# \Z 匹配字符串結(jié)束,如果是存在換行儿礼,只匹配到換行前的結(jié)束字符串
# ^ 匹配字符串的開頭
# $ 匹配字符串的末尾
print(re.findall('\Ahe',h)) # \A==>^
print(re.findall('^he',h))
print(re.findall('66\Z',h)) # \Z==>$
print(re.findall('66$',h))
> ['he']
> ['he']
> ['66']
> ['66']
重復匹配:| . | * | ? | .* | .*? | + | {n,m} |
import re
# . 匹配任意字符串咖杂,除了換行符,當re.DOTALL標記被指定時蚊夫,則可以匹配包括換行符的任意字符
print(re.findall('a.b','a1b')) #['a1b']
print(re.findall('a...b','aw1qb')) # ['aw1qb']
print(re.findall('a.b','a1b a*b a b aaab')) #['a1b', 'a*b', 'a b', 'aab']
print(re.findall('a.b','a\nb')) #[]
print(re.findall('a.b','a\nb',re.S)) #['a\nb']
print(re.findall('a.b','a\nb',re.DOTALL)) #['a\nb']同上一條意思一樣
# [...] 用來表示一組字符嚎花,單獨列出:[amk]匹配'a','m'或'k'
print(re.findall('[a,m,k]','[amkwweq]'))
# [^...] 不在[]中的字符骑脱,[^abc]匹配除了a,b,c之外的字符。
print(re.findall('[^abc]','abcde'))
# * 匹配0個或多個的表達式
print(re.findall('ab*e*','abbbbbee abbeqeq'))
# + 匹配1個或多個的表達式
print(re.findall('ab+','a')) #[]
print(re.findall('ab+','abbb')) #['abbb']
# ? 匹配0個或1個由前面的正則表達式定義的字段,非貪婪式
print(re.findall('ab?','a')) #['a']
print(re.findall('ab?','abbb')) #['ab']
#匹配所有包含小數(shù)在內(nèi)的數(shù)字
print(re.findall('\d+\.?\d*',"asdfasdf123as1.13dfa12adsf1asdf3")) #['123', '1.13', '12', '1', '3']
#.*默認為貪婪匹配
print(re.findall('a.*b','a1b22222222b')) #['a1b22222222b']
# {n} 精確匹配n個前面表達式
print(re.findall('ab{2}','abbb')) #['abb']
# {n,m} 匹配n到m次由前面的正則表達式定義的字段巩那,貪婪模式
print(re.findall('ab{2,4}','abbb')) #['abbb']
print(re.findall('ab{1,}','abbb')) #['abbb'] # 'ab{1,}' ===> 'ab+'
print(re.findall('ab{0,}','abbb')) #['abbb'] # 'ab{0,}' ===> 'ab*'
# a|b 匹配a或b
print(re.findall('a|b','esdaqwbe')) # ['a', 'b']
# () 匹配括號內(nèi)的表達式囤热,也表示一個組
print(re.findall('(qwe)','eqweee')) # ['qwe']
#[]
print(re.findall('a[1*-]b','a1b a*b a-b')) #[]內(nèi)的都為普通字符了炸枣,且如果-沒有被轉(zhuǎn)意的話搭伤,應該放到[]的開頭或結(jié)尾
print(re.findall('a[^1*-]b','a1b a*b a-b a=b')) #[]內(nèi)的^代表的意思是取反,所以結(jié)果為['a=b']
print(re.findall('a[0-9]b','a1b a*b a-b a=b')) #[]內(nèi)的^代表的意思是取反乍桂,所以結(jié)果為['a=b']
print(re.findall('a[a-z]b','a1b a*b a-b a=b aeb')) #[]內(nèi)的^代表的意思是取反冲杀,所以結(jié)果為['a=b']
print(re.findall('a[a-zA-Z]b','a1b a*b a-b a=b aeb aEb')) #[]內(nèi)的^代表的意思是取反,所以結(jié)果為['a=b']
#\# print(re.findall('a\\c','a\c')) #對于正則來說a\\c確實可以匹配到a\c,但是在python解釋器讀取a\\c時睹酌,會發(fā)生轉(zhuǎn)義权谁,然后交給re去執(zhí)行,所以拋出異常
print(re.findall(r'a\\c','a\c')) #r代表告訴解釋器使用rawstring忍疾,即原生字符串闯传,把我們正則內(nèi)的所有符號都當普通字符處理谨朝,不要轉(zhuǎn)義
print(re.findall('a\\\\c','a\c')) #同上面的意思一樣卤妒,和上面的結(jié)果一樣都是['a\\c']
#():分組
print(re.findall('ab+','ababab123')) #['ab', 'ab', 'ab']
print(re.findall('(ab)+123','ababab123')) #['ab'],匹配到末尾的ab123中的ab
print(re.findall('(?:ab)+123','ababab123')) #findall的結(jié)果不是匹配的全部內(nèi)容字币,而是組內(nèi)的內(nèi)容,?:可以讓結(jié)果為匹配的全部內(nèi)容
print(re.findall('href="(.*?)"','<a ]
print(re.findall('href="(?:.*?)"','<a ]
#|
print(re.findall('compan(?:y|ies)','Too many companies have gone bankrupt, and the next one is my company'))
re模塊提供的方法介紹
未完待續(xù)
推薦博客:https://blog.csdn.net/yufenghyc/article/details/51078107