##**正則表達式**
– 正則表達式是文本處理極為重要的技術,用它可以對字符串按照某種規則進行檢索、替換
– 分類:
– BRE:基本正則表達式,grep sed vi等軟件支持。vim有擴展
– ERE:擴展正則表達式,egrep(grep -E) sed -r等
– PCRE:幾乎所有高級語言都是PCRE的方言或者變種。
##**基礎語法**
– “.” : 匹配除換行符外任意一個字符
– [abc] : 字符集合,匹配所包含的任意一個字符
– [^abc] : 字符集合,只能表示一個字符位置。匹配除去集合內字符的任意一個字符
– [^a-z] : 字符范圍,也是集合,表示一個字符位置,匹配除去集合內字符的任意一個字符
– \b : 匹配單詞的邊界 舉例:\bb在文本中找到單詞b開頭的b字符
– \B : 不匹配單詞的邊界 舉例:t\B 包含t但不以t結尾,如write; \Bb不以b開頭的含有b的單詞,例如able
– \d : [0-9]匹配一位單詞
– \D :[^0-9]匹配一位非數字
– \s : 匹配1位空白字符,包括換行符、制表符、空格
– \S : 匹配1位非空白字符
– \w : 匹配[a-zA-Z0-9_],包括中文的字,不包括空格
– \W : 匹配\w之外的字符
###**單行模式,多行模式**
– 單行模式
– .可以匹配所有字符,包括換行符
– ^表示整個字符串的開頭,$整個字符串的結尾
– 多行模式
– .可以匹配除了換行符之外的字符
– ^表示行首,$行尾
– 開始指\n后緊接著下一個字符,結束指的是\n前的字符
###**轉義**
– 凡是在正則表達式中有特殊意義的符號,如果想使用它的本意,請使用\轉義。反斜杠自身,得使用\\
– \r \n還是轉義后代表回車、換行
##**重復**
| 代碼 | 說明 | 舉例 |
| :————-|:——————————|:—————————–|
| * |表示前面的正則表達式重復0或多次|e\w *單詞中有e然后后面非空白字符
| + |重復至少1次 |e\w+ 單詞e后面至少有一個非空白字符
| ? |重復0或1次 |e\w? 單詞e后至多有一個非空白字符
| {n} |重復固定的n次 |e\w{1} 單詞中e后面只能有一個非空白字符
| {n,} |重復至少n次 |
| {n,m} |重復n到m次 |e\w{1,10}單詞中e后面至少1個,至多10個
| x丨y |匹配x或者y |(w丨f)ood
| 捕獲 |(pattern) |捕獲后分配組號從1開始
| \數字 |匹配對應的分組 |(very) \1 匹配very very,捕獲的組group是very
| (?:pattern) |如果改變優先級就不需要捕獲分組 |(?:w丨f)ood
|(?<name>exp) |分組捕獲,通過\name訪問分組 |
| (?=exp) |斷言exp一定在右邊出現 |f(?=oo) f后面一定有oo出現
| (?<=exp) |exp左邊一定出現 |
| (?!exp) |斷言后面一定不是exp |\d{3}(?!\d) 3個數字后面一定不是數字
| (?<!exp) |斷言exp一定不再左邊出現 |(?<!f)ood 就是ood左邊一定不是f
| (?#comment) |注釋 |f(?=oo)(?#這個后斷言不捕獲)
##**貪婪與非貪婪**
– 默認是貪婪模式,也就是說盡量多匹配更長的字符串
– 非貪婪模式在重復的符號后面加上一個?問號,變少匹配了
| 代碼 | 說明 | 舉例 |
| :————-|:——————————|:—————————–|
| *? |匹配任意次,盡可能少重復 |
| +? |匹配至少1次,但盡可能少重復 |
| ?? |匹配0次或1次,少重復 |
| {n,}? {n,m}? |少重復
##**練習**
1.匹配手機號碼:
\d{11}
2.匹配座機
\d{3,4}-\d{7,8}
3.匹配0-999之間的數字
一位數:\d 兩位數:[1-9]?\d 三位數:^([1-9]\d\d?|\d)\r?$
4.匹配ip地址 0.0.0.0 – 255.255.255.255
(?:([01]?\d\d?|25[0-5]|2[0-4]\d)\.){3}([01]?\d\d?|25[0-5]|2[0-4]\d)
##**python的正則表達式**
– **常量**
– re.M re.MULTILINE 多行模式
– re.S re.DOTALL 單行模式
– re.I re.IGNORECASE 忽略大小寫
– re.X re.VERBOSE 忽略表達式中的空白字符
– **編譯**
– re.compile(pattern,flags=0) #flags如 re.I re.M re.S
– 設定flags,編譯模式,返回正則表達式對象regex
– pattern是正則表達式字符串,flags是選項。正則表達式需要被編譯,結果保存,下次便不需要再編譯
– 單次匹配(match)
– re.match(pattern,string,flags=0)
– regex.match(string[,pos[,endpos]])
– match是從字符串開頭匹配,regex對象match方法可以重設定開始位置和結束位置。
– 單次匹配(search)
– re.search(pattern,string,flags=0)
– regex.search(string[,pos[,endpos]])
– 從頭搜索直到第一個匹配,regex對象search方法可以重設定開始位置和結束位置,返回match對象
– 單次匹配(fullmatch)
– re.fullmatch(pattern,string,flags=0)
– regex.fullmatch(string[,pos[,endpos]])
– 整個字符串和正則表達式匹配
– 全部匹配(findall)
– re.findall(pattern,string,flags=0)
– regex.findall(string[,pos[,endpos]])
– 對整個字符從左至右匹配,返回所有匹配項的**列表**
– 全部匹配(finditer)
– re.finditer(pattern,string,flags=0)
– regex.finditer(string[,pos[,endpos]])
– 對整個字符串,從左至右匹配,返回所有匹配項,返回**迭代器**
###**匹配替換,分割字符串**
– 匹配替換
– re.sub(pattern,replacement,string,count=0,flags=0)
– regex.sub(replacement,string,count=0)
– 使用pattern對字符串string進行匹配,對匹配項使用repl替換;replacement可以是string bytes function
– re.subn(pattern,replacement,string,count=0,flags=0)
– regex.subn(replacement,string,count=0)
– 同sub返回一個元組(new_string,number_of_subs_made) number_of_subs_made指替換次數
– 分割字符串
– re.split(pattern,string,maxsplit=0,flags=0) 返回一個分割后的列表
##例子
import re
s = ”’01 bottle
02 bag
03 big1
100 able”’
result = re.split(‘[\s\d]+’,s)
print(result) #[”,’bottle’,’big’,’able’]
regex = re.compile(‘^[\s\d]+’,re.M)
result = regex.split(s)
print(result) #[”,’bottle\n’,’bag\n’,’big1\n’,’able’]
##**分組**
– 使用小括號的pattern捕獲的數據被放到了組group中
– match、search函數可以返回match對象;findall返回字符串列表;finditer返回一個個match對象
###練習
import re
s = ”’bottle\nbag\nbig\napple”’
regex = re.compile(‘(b\w+)\n(?P<name2>b\w+)\n(?P<name3>b\w+)’)
result = regex.match(s)
print(result.groups()) (‘bottle’,’bag’,’big’)
print(result.group(0)) ‘bottle\nbag\nbig’
print(result.group(1)) ‘bottle’
print(result.group(2)) ‘bag’
print(result.groupdict()) {‘name2′:bag,’name3’:big}
print(result.group(‘name2’)) ‘bag’
本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/88247