天天看點

re正規表達式re基礎文法常用正規表達式findall函數的應用

文章目錄

  • re基礎文法
    • 運算優先級
  • 常用正規表達式
    • 單個字元
    • 組合字元
  • findall函數的應用

re這個子產品提供了與 Perl 語言類似的正規表達式比對操作。其模式和被搜尋的字元串既可以是 Unicode 字元串 (str) ,也可以是8位位元組串 (bytes)。 但是,Unicode 字元串與8位位元組串不能混用:也就是說,你不能用一個位元組串模式去比對 Unicode 字元串,反之亦然;類似地,當進行替換操作時,替換字元串的類型也必須與所用的模式和搜尋字元串的類型一緻。

re基礎文法

正規表達式可以包含普通或者特殊字元。絕大部分普通字元,比如 ‘A’, ‘a’, 或者 ‘0’,都是最簡單的正規表達式。它們就比對自身。你可以拼接普通字元,是以 last 比對字元串 ‘last’. (在這一節的其他部分,我們将用 this special style 這種方式表示正規表達式,通常不帶引号,要比對的字元串用 ‘in single quotes’ ,單引号形式。)

有些字元,比如 ‘|’ 或者 ‘(’,屬于特殊字元。 特殊字元既可以表示它的普通含義, 也可以影響它旁邊的正規表達式的解釋。

重複修飾符 (, +, ?, {m,n}, 等) 不能直接嵌套。這樣避免了非貪婪字尾 ? 修飾符,和其他實作中的修飾符産生的多義性。要應用一個内層重複嵌套,可以使用括号。 比如,表達式 (?:a{6}) 比對6個 ‘a’ 字元重複任意次數。

運算優先級

正規表達式從左到右進行計算,并遵循優先級順序,這與算術表達式非常類似。相同優先級的從左到右進行運算,不同優先級的運算先高後低。

下表從最高到最低說明了各種正規表達式運算符的優先級順序:

運算符 描述
\ 轉義符
(), [] 圓括号和方括号
*, +, ?, {n}, {n,}, {n,m} 限定符
^, $, \任何元字元、任何字元 定位點和序列(即:位置和順序)
| 替換,“或"操作字元具有高于替換運算符的優先級,使得"m|food"比對"m"或"food”。若要比對"mood"或"food",請使用括号建立子表達式,進而産生"(m|f)ood"。

常用正規表達式

單個字元

1. . 就 是比對除 \n (換行符)以外的任意一個字元

str = 'aabbabaabbaa'
print(re.findall(r'a.b',str))
           
['aab', 'aab']
           

2. *前面的字元比對0次或以上

str = 'aabbabaabbaa'
print(re.findall(r'a*b',str))
           
['aab', 'b', 'ab', 'aab', 'b']
           

3. +前面的字元比對1次或以上

str = 'aabbabaabbaa'
print(re.findall(r'a+b',str))
           
['aab',  'aab']
           

4. ?前面的字元比對0次或1次

str = 'aabbabaabbaa'
print(re.findall(r'a?b',str))
           
['aab',  'ab', 'ab', 'aab', 'ab']
           

5. {m}對其之前的正則式指定比對 m 個重複

少于 m 的話就會導緻比對失敗。比如, a{6} 将比對6個 ‘a’ , 但是不能是5個。

6. {m,n}對正則式進行 m 到 n 次比對,在 m 和 n 之間取盡量多。

比如,a{3,5} 将比對 3 到 5個 ‘a’。忽略 m 意為指定下界為0,忽略 n 指定上界為無限次。 比如 a{4,}b 将比對 ‘aaaab’ 或者1000個 ‘a’ 尾随一個 ‘b’,但不能比對 ‘aaab’。逗号不能省略,否則無法辨識修飾符應該忽略哪個邊界。

組合字元

’*‘ 和 '+‘修飾符都是 貪婪的,它們在字元串進行盡可能多的比對;在修飾符之後添加 ‘?’ 将使樣式以 非貪婪方式進行比對,盡量少的字元将會被比對。

1. .*貪婪,比對從.*前面為開始到後面為結束的所有内容

str = 'aabbabaabbaa'
print(re.findall(r'a.*b',str))
           
['aabbabaabb']
           

2. .*? 非貪婪,遇到開始和結束就進行截取,是以截取多次符合的結果,中間沒有字元也會被截取

['aab', 'ab', 'aab']
           

3. (.*?) 非貪婪,與上面一樣,隻是與上面的相比多了一個括号,隻保留括号的内容

['a', '', 'a']
           

findall函數的應用

它在re.py中有定義:

def findall(pattern, string, flags=0):
    """Return a list of all non-overlapping matches in the string.
    If one or more capturing groups are present in the pattern, return
    a list of groups; this will be a list of tuples if the pattern
    has more than one group.
    Empty matches are included in the result."""
    return _compile(pattern, flags).findall(string)
           

即傳回string中所有與pattern比對的全部字元串,傳回形式為數組。

import re
 
str = '一段字元串'
print(re.findall(r'正規表達式',str))
           

re.findall( r’正規表達式’, str, re.S),參數有re.S,則不會對’\n’進行中斷

參考資料:

re — 正規表達式操作

正規表達式基本用法