標籤:效率 依賴 預設 match 解析 pre 一個 none property
Regex應用情境
特定規律字串的尋找替換切割等
郵箱格式、url等格式的驗證
爬蟲項目,提取特定的有效內容
很多應用的設定檔
使用原則
只要能夠通過字串等相關函數能夠解決的,就不要使用正則
正則的執行效率比較低,會降低代碼的可讀性
世界上最難讀懂的三樣東西:醫生的處方、道士的神符、碼農的正則
提醒:正則是用來寫的,不是用來讀的,不要試著閱讀別人的正則;不懂功能時必要讀正則。
基本使用
說明:正則是通過re模組提供支援的
相關函數:
match:從開頭進行匹配,找到就立即返回正則結果對象,沒有就返回None
search:匹配全部內容,任意位置,只要找到,立即返回正則結果對象,沒有返回None
# python依賴次模組完成正則功能
import re
?
# 從開頭進行匹配,找到一個立即返回正則結果對象,沒有返回None
m = re.match(‘abc‘, ‘abchelloabc‘)
# 匹配全部內容,任意位置,只要找到,立即返回正則結果對象,沒有返回None
m = re.search(‘abc‘, ‘helloabcshsjsldj‘)
if m:
print(‘ok‘)
# 擷取匹配內容
print(m.group())
# 擷取匹配位置
print(m.span())
findall:匹配所有內容,返回匹配結果組成的列表,沒有返回None
# 匹配所有內容,返回匹配結果組成的列表,沒有返回None
f = re.findall(‘abc‘, ‘abcsdisuoiabcsjdklsjabc‘)
if f:
print(f)
compile:根據字串產生Regex的對象,用於特定正則匹配,通過match、search、findall匹配
# 根據字串產生Regex的對象,用於正則匹配
c = re.compile(‘abc‘)
# 然後進行特定正則匹配
# m = c.match(‘abcdefghijklmn‘)
m = c.search(‘abcdefghijklmn‘)
if m:
print(m)
?
print(c.findall(‘abcueywiabcsjdkaabc‘))
將re模組中的match、search、findall方法的處理過程分為了兩步完成。
正則規則
單個字元
一般字元:就是一對一的完全符合
[]:中間的任意一個字元
[a-z]:表示a到z的任一字元
[0-9]:表示0到9的任一字元
[^abc]:除abc之外的字元
. :匹配‘\n‘以外的任一字元
\d:所有的數字字元,等價於[0-9]
\D:所有的非數字字元,等價於[^0-9]
\w:所有的數字、字母、中文、底線等 (就是字的意思)
\W:\w之外的所有字元
\s:所有的空白字元,如:空格、\t、\n、\r
\S:\s之外的所有字元
\b:詞邊界,如:開頭、結尾、標點、空格等
\B:非詞邊界
次數控制
*:前面的字元可以是任意次
+:前面的字元至少出現一次
?:至多一次,0次或1次
{m}:匹配固定的m次
{m,}:至少m次
{m,n}:m到n次
正則的匹配預設是貪婪的
邊界限定
import re
?
# 以指定內容開頭
# c = re.compile(r‘^abc‘)
# 以指定內容結尾
# c = re.compile(r‘abc$‘)
# 同時限制開頭和結尾
c = re.compile(r‘^abc$‘)
?
s = c.search(‘abc‘)
?
if s:
print(‘ok‘)
print(s.group())
分組匹配
|:表示或,具有最低的優先順序
():用於表示一個整體,可以確定優先順序
import re
?
# | 表示或,具有最低的優先順序
# () 用於表示一個整體,可以確定優先順序
c = re.compile(r‘a(hello|world)d‘)
?
s = c.search(‘aworldd‘)
?
if s:
print(‘ok‘)
print(s.group())
()還有分組匹配的作用,下次再講。
練習:
若匹配有特殊正則含義的字元怎麼辦,如:\d
驗證一個字串是否是正確的郵箱格式
驗證一個字串是否是正確的url格式
思路
以功能為導向
寫出符合規則的若干字串
寫一點測一點,不斷的調整
最終完成功能
python Regex