正則
概述:
分類:
- BRE:基本正則表達式,grep sed vi等軟件支持。vim有擴展
- ERE:擴展正則表達式,egrep(grep -E)、sed -r等
- PCRE:幾乎所有高級語言都是PCRE的方言或變種。python從1.6開始使用SRE正則表達式引擎,可以認為是PCRE的子集,見模塊re
基本語法
元字符
- . 匹配除換行符外任意一個字符
- [abc]:字符集合,只能表示一個字符的位置,匹配所有包含的任意一個字符:[abc]匹配plain中的‘a’
- [^abc]:字符集合,只能表示一個字符的位置,匹配除去集合內字符的任意一個字符:[abc]匹配plain中的‘p’、‘l’、‘i’、‘n’
- [a-z]:字符范圍,也是一個集合,表示一個字符位置,匹配所包含的任意一個字符
- [^a-z]:匹配除去集合內字符的任意一個字符
- \b:匹配單詞的邊界:\bb在文本中找到單詞b開頭的b字符
- \B:不匹配單詞的邊界:t\B包含t的單詞但是不以t結尾的t字符,如write
- \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次
- ?:表示前面的正則表達式會重復0次或1次
- {n}:重復固定n次
- {n,}:重復至少n次 {1,}等價于+ | {0,}等價于啊* | {0,1}等價于?
- {n,m}:重復n到m次
- x|y:匹配x或者y
- 捕獲:
- (pattern):使用小擴號指定一個子表達式,也叫分組。捕獲后會自動分配組從1開始可以改變優先級
- \數字:匹配對應分組
- (?:pattern):如果僅僅為了改變優先級,就不需要捕獲分組
- (?\<name\>exp)、(?’name’exp):分組捕獲,但是可以name訪問分組python語法必須是(?P\<name\>exp)
- 零寬斷言
- (?=exp):斷言exp一定在匹配的右邊出現,也就是說斷言后面一定跟一個exp:f(?=oo)f后面一定有oo出現
- (?<=exp):斷言exp一定出現在匹配的左邊,也就是說前面一定有個exp前綴:(?<=f)ood,ood前一定有f出現
- 負向零寬斷言:
- (?!exp):斷言exp一定不會出現在右側,也就是說斷言后面一定不是exp
- (?>!exp):斷言exp一定不能出現在左側,也及時說斷言前面一定不能是exp:(?<!f)ood ood的左邊一定不是f</li>
- (?#comment):注釋 例如:f(?=oo)(?#這個后斷言不捕獲)
分組和捕獲是同一個意思,能用簡單表達式,就不要用復雜的表達式
貪婪與非貪婪
- 默認是貪婪模式,也就是說盡量匹配更長的字符串
- 非貪婪模式很簡單,在重復的符號后面加一個?問好,就是盡量少匹配了
- *?:匹配任意次,但盡可能少重復
- +?:匹配至少一次,但盡可能少重復
- ??:匹配0次或一次,但盡可能少重復
- {n,}?:匹配至少n次,但盡可能少重復
- {n,m}?:匹配至少n次,至多m次,但盡可能少重復
- 引擎選項:
- IgnoreCase:匹配時忽略大小寫。re.l/re.IGNORECASE
- Singleline:單行模式:.可以匹配所有字符,包括\n。re.S/re.DOTALL
- Multiline:多行模式:^行首、$行尾。re.M/re.MULTILINE
- IgnorePatternWhitespace:忽略表達式中的空白字符,如果要使用空白字符用轉義,#可以用來左注釋。re.X/re.VERBOSE
練習:
Python的正則表達式
- Python使用re模塊提供了正則表達式處理的能力
- 常量:
- re.M/re.MULTLINE:多行模式
- re.S/re.DOTALL:單行模式
- re.l/re.IGNORECASE:忽略大小寫
- re.X/re.VERBOSE:忽略表達式中的空白字符
- 使用|位或運算開啟多種選項
- 方法:
- 編譯:
- re.compile(pattern,flags=0)
- 設定flags,編譯模式,返回正則表達式對象regex
- pattern就是正則表達式字符串,flags是選項。正則表達式需要被編譯,為了提高效率,這些編譯后的結果被保存,下次使用同樣的pattern的時候,就不需要再次編譯。
- re的其他方法為了提高效率都調用了編譯方法,就是為了提速
單次匹配:
- re.match(pattern,string,flags=0)
- regex.match(string,pos[,endpos])
- match匹配從字符串的開頭匹配,regex對象match方法可以重設定開始位置和結束位置。返回match對象
- re.search(pattern,string,flags=0)
- regex.search(string[,pos[,endpos]])
- 從頭搜索直到第一個匹配,regex對象search方法可以重設定開始位置和結束位置,返回match對象
- re.fullmatch(pattern,string,flags=0)
- regex.fullmatch(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_sub_made)
字符串分割函數劣勢:不能指定多個字符串進行分割
- re.split(pattern,string,maxsplit=0,flags=0)
- re.split分割字符串
- 使用小擴號的pattrn捕獲的數據被放到了組group中
- match、search函數可以返回match對象;findall返回字符串列表;finditer返回一個個match對象
- 如果pattern中使用了分組,如果有匹配結果,會在match對象中
- 1.使用group(N)方式返回對應分組,1-N是對應的分組,0返回整個匹配的字符串
- 2.如果使用了命名分組,可以使用group(‘name’)的方式取分組
- 3.也可以使用groups()返回所有分組
- 4.使用groupdict()返回所有命名的分組
作業:(紅色標記未完成)


本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/88239
朋友,你看的是多少期的內容?怎么會有這么多的知識呢?