文章目錄
- 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 — 正規表達式操作
正規表達式基本用法