正規表示式:(是一種獨立的語法,與python語言沒有關係)
定義: 一種匹配字串的規則
正規表示式的應用:
可以定製乙個規則:
1.確定/判斷某個字串是否符合規則
2.在一大段字串中找到符合規則的內容
程式領域:
1.登陸註冊網頁的表單 驗證 web開發
3.自動化開發, 日誌分析
幫助學習的測試工具 站長工具
元字元
\d == [0-9] 匹配的是乙個數字
\w == [0-9a-za-z_] 匹配的是字母數字下劃線
\s == [\n \t 空格] 匹配回車 空格 製表符"tab"
\d 匹配非數字
\w 匹配回車 空格 製表符
\s 匹配非空白
[\d\d], [\s\s], [\w\w] 匹配所有型別字串
^ 判斷是否是字串開頭,後面跟上要識別的內容
$ 判斷是否是結尾,前面跟上內容
a|b 匹配 | 兩端的字元a 或者字元b
. 匹配除了換行符以外的任意字元 (ps: 在爬蟲中用的比較多)
() 分組,可以約束一組字串
字元組 [ ]
在乙個字元的位置上能出現的內容
例: [1cd] 是個範圍, 代表這個位置的字元可以是1,c,d 中的任意乙個
[0-9][a-z][a-z] 匹配三個字元
[2-7abc] 匹配乙個字元, 可以是2-7中的任意數字或者a,b,c中乙個
[0-9a-za-z] 匹配乙個字元
ps: 匹配過程:從頭開始匹配乙個字串,匹配到多少個,就返回多少條結果
量詞:
? 匹配前乙個字元0次或1次, 可有可無
+ 匹配前乙個字元多次或一次
* 匹配前乙個字元0次或多次, ?與+拼在一起
匹配前乙個字元重複n次
匹配前乙個字元n+次, n次或更多次
匹配前乙個字元重複n至m次
貪婪匹配:(正規表示式的預設匹配規則, 用的回溯演算法) 在滿足匹配時,匹配盡可能長的字串,預設情況下,採用貪婪匹配
僅帶有*,+等都是貪婪匹配,也就是盡可能匹配,量詞的後面加 ? 號使其變成惰性匹配
幾種常用的非貪婪匹配:(惰性匹配)
*? 重複任意次,但盡可能少重複
+? 重複1次或更多次,但盡可能少重複
?? 重複0次或1次,但盡可能少重複
? 重複n到m次,但盡可能少重複
? 重複n次以上,但盡可能少重複
訓練:<.*>
<.*?>
.^$
*+?{}
[ ]
分組()?與 或 | [^]
re模組
介紹:正規表示式內建在python中,需要用re模組呼叫出來
pattern......匹配的正規表示式
string.......要匹配的字串。
flags......標誌位,用於控制正規表示式的匹配方式,如:是否區分大小寫,多行匹配等等。參見:正規表示式修飾符 - 可選標誌
regexobject 正規表示式物件
常用匹配方法:
1. re.findall(pattern,string,flags=0) *****
把匹配到的字元以列表的形式返回
2. re.search(pattern,string,flags=0) *****
在string中尋找模式,僅返回乙個值
3. re.match(pattern,string,flags=0) **
在string的開始處匹配模式
4. re.sub(pattern, repl, string, count=0, flags=0) ***
匹配字元並替換並可以控制替換次數
5. re.subn(pattern, repl, string, count=0, flags=0) ***
匹配字元並替換,可以控制替換次數,列印時會返回替換次數
6. re.split(pattern,string,maxsplit=0,flags=0) ***
匹配到的字元被當作列表的切割符,返回乙個列表
7. re.compile(pattern) ***** (可以提高時間效率)
根據包含正規表示式的字串 建立乙個regexobject,可以通過regexobject進行re方法操作
8. re.finditer(pattern) ***** (可以提高空間效率)
返回乙個迭代器 (用for迴圈迭代)
常用方法:
group() 獲取乙個或者多個分組匹配的字串
groups() 獲取全部分組的匹配的結果 放在乙個元組裡,可以只列印索引的結果
轉義符
應用場景:假如匹配的文字中有"\",在正規表示式中就需要有"\\\\"
在python中有更簡單的方法,在pattern或str前面加上 r 就代表轉義
其他匹配模式:
re.i
忽略大小寫
re.m
多行模式
re.s
點 任意模式
分組() 的應用:
在re.findall 中會優先顯示分組中的內容, 想要取消分組內容優先,需要宣告(?:pattern)
在re.split 中會保留切割符(被切掉的內容)
在re.search 如果有多個分組的pattern時,通過group(n)可以拿到索引對應的匹配到的內容
ret=re.findall(r"\d+(?:\.\d+)|(\d+)","1-2*(60+(-40.35/5)-(-4*3))") #顯示所有整數
print(ret) #['1', '2', '60', '', '5', '4', '3']
正表示式高階:
分組命名:
(?ppattern) 表示給分組起名字
(?p=name) 表示使用這個分組,匹配到的內容ing該和分組中的內容完全相同 , 通常跟在(?ppattern)的後面使用
標籤匹配:ret = re.search("<(?p\w+)>\w+","")
print(ret.group('name')) #結果 :h1
print(ret.group()) #結果 :
ret = re.search(r'<(\w+)>(\w+)',r'wahaha')
print(ret.group()) #wahaha
print(ret.group(1)) #a
print(ret.group(2)) #wahaha
print(ret.group(3)) #b
ret = re.search(r'<(?p\w+)>(?p\w+)',r'wahaha')
print(ret.group()) #wahaha
print(ret.group('tag')) #a
print(ret.group('c')) #wahaha
練習:
import rest= re.findall('\d+',"adfhauo14145")
print(st)
st1 = re.search('\d+',"adfhauo14145")
if st1:print(st1.group())
st2 = re.match("\d+","1414adfhauo14145")
if st2:print(st2.group())
its = re.subn('\d','w','afajfj134jh41432')
print(its)
its1 = re.finditer('\d+','agfg14414ggh4gh1g4h1g4h1g4h1g4hg')
for r in its1:
print(r.group())
its3 = re.compile('\d+')
f = its3.finditer("fhagf245jh21443")
for r in f:print(r.group())
f1 = re.split("(\d)","ahfv3142bhbh25hb5h2v5")
print(f1)
re 正規表示式模組
import re 預定義字符集 d 數字 0 9 d 非數字 d s 空白字元 空格 t r n f v s 非空白字元 s w 單詞字元 a za z0 9 w 非單詞字元 w 匹配數量 匹配除換行符以外的任何單個字元 匹配前乙個字元0或無限次 盡可能多的匹配 盡可能少的進行匹配前邊的正規表示式...
正規表示式 re模組
re是python中的正規表示式模組,正則也是每個人程式設計之路上必備的基礎技能。這部落格希望即便從來沒接觸過的人看了也會使用正規表示式字元 含義.匹配除了換行符外的任何字元。可以用re.dotall來設定匹配任何字元,包括換行符 丨a丨b 表示正規表示式匹配a或者b 匹配輸入字串開始的位置,如果設...
正規表示式re模組
正規表示式re模組 編譯正規表示式模式,返回乙個物件的模式。可以把那些常用的正規表示式編譯成正規表示式物件,這樣可以提高一點效率。1 compile 格式 re.compile pattern,flags 0 pattern 編譯時用的表示式字串。flags 編譯標誌位,用於修改正規表示式的匹配方式...