如果是匹配url呢? from urllib.parse import urlparse 了解一下
2019年前端必用正則(js)
python正則詳細講解帶有示例
下面這張大圖有示例:需要拖到另一個網頁可以看的更清楚
練習:
<div class="subInfo">低樓層/共46層</div> 正則表達式 如何提取“低樓層” 而不要后面的“共46層” 代碼: (?<=>).+?(?=\/)
python正則表達式
^ 匹配開始 $ 匹配行尾 . 匹配出換行符以外的任何單個字符,使用-m選項允許其匹配換行符也是如此 [...] 匹配括號內任何當個字符(也有或的意思) [^...] 匹配單個字符或多個字符不在括號內 * 匹配0個或多個匹配前面的表達式 + 匹配1個或多個前面出現的表達式 ? 匹配0次或1次前面出現的表達式 {n} 精確匹配前面出現的表達式的數量 {n,m} 匹配至少n次到m次 a | b 匹配a或b *?,+?,??,{m,n}? 這樣在*,+,?,{m,n} 變成非貪婪模式 (re) 組正則表達式並及時匹配的文本 (?imx) 暫時切換上i,m或x震澤表達式的選項,如果括號中,僅該地區受到影響 (?: re) 組正則表達式而匹配的記住文字 (?#....) 注釋 (?=re) 指定使用的模式位置,沒有一個范圍 (?!re) 使用指定模式取反位置,沒有一個范圍 (?<n1>..) 用列表的方式匹配
url(r'^abc/(?P<name>\w+/)$',views.cccc), http://127.0.0.1:8000/adfadfasdf213/ 得到值adfadfasdf213/
(r"/index/(?P<page>\d*)", home.IndexHandler),
\d 數字[0-9] digit
\D 非數字 == [^0-9] or [^\d]
\s 空白字符
\S 非空白字符
\w 字母數字下划線 word
\W 非字母數字下划線
正則表達式是一個特殊的字符序列,他能幫你檢查字符串是否與某種模式匹配
re模塊
re模塊使用python擁有全部的正則表達式功能
re.I(re.IGNORECASE): 忽略大小寫(括號內是完整寫法) re.M(MULTILINE):(多行模式,改變“^”,"$"的行為) re.S(DOTALL):(點任意匹配模式,改變"." 的行為) re.X(VERBOSE):詳細模式。這個模式下正則表達式可以是多行,忽略空白字符,並可以加入注釋。
re.complit
compile 函數根據一個模式字符串和可選的標志參數生成一個正則表達式對象。該對象擁有一系列方法用於正則表達式匹配和替換
格式:re.match(pattern,string,flags=0) #pattern: 正則模型, string:要匹配的字符串 falgs:匹配模式
a = re.complit(r"\d*", re.I) b = a.match("ABCde")
re.match --》從起始位置匹配
re.match 函數嘗試從字符串的其實位置匹配一個模式,如果不是起始位置匹配成功的話,match()就返回none
print(re.match('com','comwww.runcomoob').group()) print(re.match('com','Comwww.runcomoob',re.I).group()) 執行結果: com com
re.seach --》匹配到第一個就返回,否則為None
re.search(pattern,string,flags=0)
re.search函數會在字符串內查找模式匹配,只要找到第一個匹配然后返回,如果字符串沒有匹配,則返回None
print(re.search('\dcom','www.4comrunoob.5com').group()) 執行結果: 4com
*注:match 和search一旦匹配成功,就是一個match object對象,而match object 對象有以下方法:
·group()返回被RE匹配的字符串
·start()返回匹配開始的位置
·end()返回匹配結束的位置
·span()返回一個元組包含匹配(開始,結束)的位置
·group()返回re整體匹配的字符串,可以一次輸入多個組號,對應組號匹配的字符串
a. group()返回re整體匹配的字符串,
b. group (n,m) 返回組號為n,m所匹配的字符串,如果組號不存在,則返回indexError異常
c.groups()groups() 方法返回一個包含正則表達式中所有小組字符串的元組,從 1 到所含的小組號,通常groups()不需要參數,返回一個元組,元組中的元就是正則表達式中定義的組。
import re a = "123abc456" print(re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(0)) #123abc456,返回整體 print(re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(1)) #123 print(re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(2)) #abc print(re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(3)) #456
u= "http://k.autohome.com.cn/325/quality/02#pvareaid=#2073101"
import re
print re.search("\d{2}(?=#)",u).group()
>> 02
###group(1) 列出第一個括號匹配部分,group(2) 列出第二個括號匹配部分,group(3) 列出第三個括號匹配部分。###
re.findall --》遍歷匹配
re.findall 遍歷匹配,可以獲取字符串中所有匹配的字符串,返回一個列表 格式:
re.findall(pattern,string,flags=0)
p = re.compile(r'\d+') print(p.findall('o1n2m3k4')) 執行如果如下: ['1','2','3','4'] import re tt = "Tina is a good girl , she is cool ,clever, and so on ..." rr = re.compile(r'\w*oo\w*') print(rr.findall(tt)) print(re.findall(r'(\w)*oo(\w)'tt)) 執行結果如下 ['good','cool'] [('g','d'),('c','l')]
re.finditer
finditer()
搜索string,返回一個順序訪問每一個匹配結果(match對象)的迭代器。找到RE匹配的所以子串,並把他們昨晚一個迭代器返回
格式:re.finditer(pattern,string,flags=0)
iter = re.finditer(r'\d+','12 drumm44ers drumming, 11.. 10..') for i in iter: print(i) print(i.group()) print(i.span()) 執行結果如下: <_sre.SRE_Match object; span=(0, 2), match='12'> 12 (0, 2) <_sre.SRE_Match object; span=(8, 10), match='44'> 44 (8, 10) <_sre.SRE_Match object; span=(24, 26), match='11'> 11 (24, 26) <_sre.SRE_Match object; span=(31, 33), match='10'> 10 (31, 33)
re.split
split()
安裝能夠匹配的字符串將string分割后返回列表
可以使用re.split來分割字符串,如:re.split(r'\s+',text);將字符串按空格分割成一個單詞列表
格式:re.split(pattern,string[,maxsplit])
print(re.split('\d+','one1two2three3four4five5')) 執行結果如下: ['one','two','three','four','five']
re.sub
sub()
使用re替換string中每一個匹配的子串后返回替換后的字符串
格式:re.sub(pattern,repl,string,count)
import re text = "JGood is a handsome boy, he is cool, clever, and so on..." print(re.sub(r'\s+', '-', text)) 執行結果如下: JGood-is-a-handsome-boy,-he-is-cool,-clever,-and-so-on... 其中第二個函數是替換后的字符串;本例中為'-' 第四個參數指替換個數。默認為0,表示每個匹配項都替換。
subn()
返回替換次數
格式:
subn(pattern,repl,string,count=0,flags=0)
print(re.subn('[1-2]','A','123456abcdef')) print(re.sub("g.t","have",'I get A, I got B ,I gut C')) print(re.subn("g.t","have",'I get A, I got B ,I gut C')) 執行結果如下: ('AA3456abcdef', 2) I have A, I have B ,I have C ('I have A, I have B ,I have C', 3)
區別
1、re.match與re.search 與re.findall 的區別:
re.match只匹配字符串的開始,如果字符串開始不符合正則表達式,則匹配失敗,函數返回None;
而re.search匹配整個字符串,直到找到一個匹配
a=re.search('[\d]',"abc33").group() print(a) p=re.match('[\d]',"abc33") print(p) b=re.findall('[\d]',"abc33") print(b)
執行結果: 3 None ['3', '3']
貪婪匹配與非貪婪匹配
*?,+?,??,{m,n}? 前面的*,+,?等都是貪婪匹配,也就是盡可能匹配,后面加?號使其變成惰性匹配
a = re.findall(r"a(\d+?)",'a23b') print(a) b = re.findall(r"a(\d+)",'a23b') print(b) 執行結果: ['2'] ['23']
用flags時遇到的小坑
print(re.split('a','1A1a2A3',re.I))#輸出結果並未能區分大小寫
這是因為re.split(pattern,string,maxsplit,flags)默認是四個參數,當我們傳入的三個參數的時候,系統會默認re.I是第三個參數,所以就沒起作用。如果想讓這里的re.I起作用,寫成flags=re.I即可。