一、正則表達式
①正則表達式:由一系列特殊字符拼接而成的表達式/規(guī)則嘀粱,該表達式用于從一個大字符串中匹配出符合規(guī)則的子字符串
②窄俏、常用匹配模式(元字符)
元字符 (參見 python 模塊 re 文檔)
. 匹配任意字符(不包括換行符)
^ 匹配開始位置约谈,多行模式下匹配每一行的開始
$ 匹配結(jié)束位置指巡,多行模式下匹配每一行的結(jié)束
* 匹配前一個元字符0到多次
+ 匹配前一個元字符1到多次
? 匹配前一個元字符0到1次
{m,n} 匹配前一個元字符m到n次
\ 轉(zhuǎn)義字符,跟在其后的字符將失去作為特殊元字符的含義火鼻,例如\.只能匹配.室囊,不能再匹配任意字符
[] 字符集,一個字符的集合魁索,可匹配其中任意一個字符
| 邏輯表達式 或 融撞,比如 a|b 代表可匹配 a 或者 b
(...) 分組,默認為捕獲粗蔚,即被分組的內(nèi)容可以被單獨取出尝偎,默認每個分組有個索引,從 1 開始鹏控,按照"("的順序決定索引值
(?iLmsux) 分組中可以設(shè)置模式致扯,iLmsux之中的每個字符代表一個模式,用法參見 模式 I
(?:...) 分組的不捕獲模式,計算索引時會跳過這個分組
(?P<name>...) 分組的命名模式当辐,取此分組中的內(nèi)容時可以使用索引也可以使用name
(?P=name) 分組的引用模式抖僵,可在同一個正則表達式用引用前面命名過的正則
(?#...) 注釋,不影響正則表達式其它部分,用法參見 模式 I
(?=...) 順序肯定環(huán)視缘揪,表示所在位置右側(cè)能夠匹配括號內(nèi)正則
(?!...) 順序否定環(huán)視耍群,表示所在位置右側(cè)不能匹配括號內(nèi)正則
(?<=...) 逆序肯定環(huán)視,表示所在位置左側(cè)能夠匹配括號內(nèi)正則
(?<!...) 逆序否定環(huán)視找筝,表示所在位置左側(cè)不能匹配括號內(nèi)正則
(?(id/name)yes|no) 若前面指定id或name的分區(qū)匹配成功則執(zhí)行yes處的正則蹈垢,否則執(zhí)行no處的正則
\number 匹配和前面索引為number的分組捕獲到的內(nèi)容一樣的字符串
\A 匹配字符串開始位置,忽略多行模式
\Z 匹配字符串結(jié)束位置呻征,忽略多行模式
\b 匹配位于單詞開始或結(jié)束位置的空字符串
\B 匹配不位于單詞開始或結(jié)束位置的空字符串
\d 匹配一個數(shù)字耘婚, 相當于 [0-9]
\D 匹配非數(shù)字,相當于 [^0-9]
\s 匹配任意空白字符, 相當于 [ \t\n\r\f\v]
\S 匹配非空白字符陆赋,相當于 [^ \t\n\r\f\v]
\w 匹配數(shù)字、字母嚷闭、下劃線中任意一個字符攒岛, 相當于 [a-zA-Z0-9_]
\W 匹配非數(shù)字、字母胞锰、下劃線中的任意字符灾锯,相當于 [^a-zA-Z0-9_]
③、應用
1嗅榕、\w匹配字母數(shù)字及下劃線
print(re.findall('\w',"bs aaah1314ck a(vdv*acaj")
- \W匹配非字母數(shù)字下劃線
print(re.findall('\W',"bs aaah1314ck a(vdv*acaj)"))
3顺饮、\s匹配任意空白字符吵聪,等價于[\t\n\r\f]
print(re.findall('\s','bs aaah1\t314\nck a(vdv*acaj)'))
print(re.findall('\w\s',"h ello 123_ (0"))
4、\S匹配任意非空字符
print(re.findall('\S','bs aaah1\t314\nck a(vdv*acaj)'))
5兼雄、\d匹配任意數(shù)字
print(re.findall("\d",'bs aaah1314ck a(vdv*acaj)'))
6吟逝、\D匹配任意非數(shù)字
print(re.findall('\D','bs aaah1314ck a(vdv*acaj'))
print(re.findall("a\db","a1b a2b a b aab aaaaaaaa1b a2c a22c a 3c"))
7、\n與\t:自己打的回車也算一個\n
msg="""h e\tll\n\no 123_ (0
"""
print(re.findall('\n',msg))
print(re.findall('\t',msg))
print(re.findall(' ',msg))
8赦肋、^與只匹配最后一個佃乘,如不存在也不會往前匹配
print(re.findall("^egon","egon asdf 213123 egonafsadfegon"))
print(re.findall("egon$","egon asdf 213123 egonafsadfegon "))
print(re.findall("a\w\w\wc","ab12c3c a213c"))
print(re.findall("^a\w\w\wc$","ab_2c"))
9囱井、.與[]
9.1 .:代表匹配一個字符,該字符可以是任意字符
print(re.findall("a\db","a1b a2b aab aaaaaaab a+b a-b a c"))
print(re.findall("a\wb","a1b a2b aab aaaaaaab a+b a-b a c"))
print(re.findall("a.b","a1b a2b aab aaaaaaab a+b a-b a b a c"))
.默認匹配除了\n之外的所偶字符趣避,如果要讓.也匹配\n需要在后面加上re.DATALL
print(re.findall("a.b","a1b a2b aab aaaaaaab a\tb a-b a\nb a c",re.DOTALL))
9.2 []:代表匹配一個字符庞呕,我們可以指定該字符的范圍
print(re.findall("a[+-]b", "a1b a2b aab aaaaaaab a+b a-b a c"))
print(re.findall("a[.*/+-]b", "a.b a2b a*b a/b aab aaaaaaab a+b a-b a c"))
print(re.findall("a[a-z]b", "a.b a2b a*b a/b aab aaaaaaab a+b a-b a c")) # -放在[]內(nèi)的開頭或結(jié)果
print(re.findall("a[a-zA-Z]b", "a.b a2b a*b a/b aAb aCb aab aaaaaaab a+b a-b a c")) # -放在[]內(nèi)的開頭或結(jié)果
print(re.findall("a\db", "a.b a2b a*b a/b aAb aCb aab aaaaaaab a+b a-b a c")) # -放在[]內(nèi)的開頭或結(jié)果
print(re.findall("a[0-9]b", "a.b a2b a*b a/b aAb aCb aab aaaaaaab a+b a-b a c")) # -放在[]內(nèi)的開頭或結(jié)果
[^...]代表取反
print(re.findall("a[^0-9]b", "a.b a2b a*b a/b aAb aCb aab aaaaaaab a+b a-b a c")) # -放在[]內(nèi)的開頭或結(jié)果
9.3 *: 左邊那個字符出現(xiàn)0次或者無窮次
print(re.findall("ab*","a ab abb abbbbbbbbbbbb bbbbbbbbb"))
9.4 +: 左邊那個字符出現(xiàn)1次或者無窮次
print(re.findall("ab+","a ab abb abbbbbbbbbbbb bbbbbbbbb"))
9.5 {n,m}: 左邊那個字符出現(xiàn)n次到m次
print(re.findall("ab{0,}","a ab abb abbbbbbbbbbbb bbbbbbbbb"))
print(re.findall("ab*","a ab abb abbbbbbbbbbbb bbbbbbbbb"))
print(re.findall("ab{1,}","a ab abb abbbbbbbbbbbb bbbbbbbbb"))
print(re.findall("ab+","a ab abb abbbbbbbbbbbb bbbbbbbbb"))
print(re.findall("ab{2,5}","a ab abb abbb abbbb abbbbbbbb abbbbbbbbbbbb bbbbbbbbb"))
9.6 ?: 左邊那個字符出現(xiàn)0次到1次
print(re.findall("ab?","a ab abb abbbbbbbbbbbb bbbbbbbbb"))
9.7 .*: 匹配所有
print(re.findall("a.*b","123 a1231-==-000b123123123123123b"))
print(re.findall("a.*?b","123 a1231-==-000b123123123123123b"))
9.7例1:
msg = '<a target="_blank"><strong><span style="color: #ff0000;">原理圖:https://pan.baidu.com/s/1skWyTT7</span></strong></a><a
url_pattern = re.compile('href="(.*?)"')
res=url_pattern.findall(msg)
print(res)
res=url_pattern.findall('<a href="www.sina.com.cn"></a>')
print(res)
9.7例2:
print(re.findall("a.*b","a1b a+b a-b a\nb a\tb",re.DOTALL))
10 ():分組
print(re.findall('ab+','ababab123')) #['ab', 'ab', 'ab']
print(re.findall('(ab)+123','ababab123')) #['ab'],匹配到末尾的ab123中的ab
10.1 取消分組
print(re.findall('(?:ab)+123','ababab123'))
#findall的結(jié)果不是匹配的全部內(nèi)容程帕,而是組內(nèi)的內(nèi)容,?:可以讓結(jié)果為匹配的全部內(nèi)容
11 |:或者
print(re.findall("compan(?:ies|y)","Too many companies have gone bankrupt, and the next one is my company'"))
print(re.findall("\d+\.?\d*","as9fdasl333...4444df1111asdf3333dfadf333.44dafadf3.5555asdfsafd.5555"))
- \
print(re.findall('a\\c','a\c a1c aac'))
#對于正則來說a\\c確實可以匹配到a\c,但是在python解釋器讀取a\\c時住练,會發(fā)生轉(zhuǎn)義,然后交給re去執(zhí)行骆捧,所以拋出異常
print(re.findall('a\\\\c','a\c a1c aac')) # 正確
④澎羞、re模塊提供的方法介紹
# ===========================re模塊提供的方法介紹===========================
import re
#1
print(re.findall('e','alex make love') )
#['e', 'e', 'e'],返回所有滿足匹配條件的結(jié)果,放在列表里
#2
print(re.search('e','alex make love').group())
#e,只到找到第一個匹配然后返回一個包含匹配信息的對象,該對象可以通過調(diào)用group()方法得到匹配的字符串,如果字符串沒有匹配,則返回None敛苇。
#3
print(re.match('e','alex make love'))
#None,同search,不過在字符串開始處進行匹配,完全可以用search+^代替match
#4
print(re.split('[ab]','abcd'))
#['', '', 'cd']妆绞,先按'a'分割得到''和'bcd',再對''和'bcd'分別按'b'分割
#5
print('===>',re.sub('a','A','alex make love')) #===> Alex mAke love,不指定n枫攀,默認替換所有
print('===>',re.sub('a','A','alex make love',1)) #===> Alex make love
print('===>',re.sub('a','A','alex make love',2)) #===> Alex mAke love
print('===>',re.sub('^(\w+)(.*?\s)(\w+)(.*?\s)(\w+)(.*?)$',r'\5\2\3\4\1','alex make love')) #===> love make alex
print('===>',re.subn('a','A','alex make love')) #===> ('Alex mAke love', 2),結(jié)果帶有總共替換的個數(shù)
#6
obj=re.compile('\d{2}')
print(obj.search('abc123eeee').group()) #12
print(obj.findall('abc123eeee')) #['12'],重用了obj
二括饶、面向?qū)ο?br>
面向過程編程
核心是過程二字,過程是解決問題的步驟来涨,即先干啥再干啥后干啥
基于該思想寫程序就是在設(shè)計一條條的流水線
優(yōu)點:復雜的問題流程化图焰、進而簡單化
缺點:擴展性差
面向?qū)ο缶幊?br>
核心是對象二字,對象是一個用來盛放數(shù)據(jù)與功能的容器
基于該思想寫程序就是在整合程序
優(yōu)點:可擴展性強
缺點:編程的復雜度高
其實無論怎么編程底層用的也一定是面向過程蹦掐,并且不是所有場合都適用面向?qū)ο蠹几帷.吘箤τ谲浖碚f可擴展性只是衡量的一個標準。