標籤:Regex 總結 python 基礎
一、前奏:
1. Regex:Regex是一種用來匹配字串的強有力的武器。它的設計思想是用一種描述性的語言來給字串定義一個規則,凡是符合規則的字串,我們就認為它“匹配”了,否則,該字串就是不合法的。
2.因為Regex也是用字串表示的,所以,我們要首先瞭解如何用字元來描述字元,下面就是最常用的描述字元:
\d:表示可以匹配一個數字,比如:‘00\d‘可以匹配‘001‘,‘\d\d\d‘可以匹配‘010‘
\w:表示可以匹配一個字母或數字,比如:‘\w\w\w‘可以匹配‘abc‘
以上的匹配都是精確匹配,也就是說是一個字母或者一個數字進行一一對應的匹配
3.那麼,對於變長的匹配我們就需要用到其他的字元了,用*表示任意個字元(包括0個),用+表示至少一個字元,用?表示0個或1個字元,用{n}表示n個字元,用{n,m}表示n-m個字元,其實只要明白,這些符號相對應的作用,再加以練習就可以熟練使用了,理解倒不是很難。
例子:\d{3}\s+\w{3,8}:\d{3}表示三個數字組合,\s+至少有一個空格,\w{3,8}表示有3到8個字母
4.要做更精確地匹配,可以用[]表示範圍
(1).比如:[0-9a-zA-Z\_]可以匹配一個數字、字母或者底線,注意這裡底線前面需要用一個\來進行逸出字元;
[0-9a-zA-Z\_]+可以匹配至少由一個數字、字母或者底線組成的字串,注意這裡底線前面需要用一個\來進行逸出字元;
[a-zA-Z\_][0-9a-zA-Z\_]*可以匹配由字母或底線開頭,後接任意個由一個數字、字母或者底線組成的字串;
[a-zA-Z\_][0-9a-zA-Z\_]{0, 19}更精確地限制了變數的長度是1-20個字元(前面1個字元+後面最多19個字元);
^表示行的開頭,^\d表示必須以數字開頭。
$表示行的結束,\d$表示必須以數字結束。
(2).其實[]的作用就一個分隔字元的作用,每個分隔字元中間有所需的數字或者字母的範圍,緊跟著的{}中的值是確定[]中的範圍的。
二、使用:
1.我們都是使用re模組中的match方法進行匹配的,re.match(r‘Regex‘,‘需要匹配的字串‘),我們強烈建議使用Python的r首碼,就不用考慮轉義的問題了。
2.match()方法判斷是否匹配,如果匹配成功,返回一個Match對象,否則返回None,一般我們可以把它用在if語句後面來進行是否匹配成功。
舉例: import re,time
a=input(‘請輸入一個您要查詢所屬地的有線電話號碼‘)
if re.match(r‘[0-9]{4}[\-][0-9]{7}‘,a):
print(‘您輸入的號碼正確請稍候,正在為您查詢中...‘)
time.sleep(3)
print(‘您好,這是新疆的有線電話號碼‘)
else:
print(‘號碼輸入錯誤請重新輸入‘)
>>> ================================ RESTART ================================
>>>
請輸入一個您要查詢所屬地的有線電話號碼0993-6999720
您輸入的號碼正確請稍候,正在為您查詢中...
您好,這是新疆的有線電話號碼
3.如果要匹配逗號,底線這些特殊字元,在Regex中需要在前面加一個\。
三、切割字串:
1.我們可以用re.split(Regex,需要分割的字串),在Regex中使用split,這裡的Regex就被split當作分割字串的依據了
舉例:>>> re.split(r‘[\s\;\,]+‘,‘as,sd we;was;,;bi‘)
[‘as‘, ‘sd‘, ‘we‘, ‘was‘, ‘bi‘]
我們就可以用這種方法把不規範的輸入轉換為正確的列表輸出
四、分組:
1.除了簡單地判斷是否匹配之外,Regex還有提取子串的強大功能,用()表示的就是要提取的分組(Group),其實就是將原來的[]{}分用()的擴起來表示一個分組。
舉例: >>> m = re.match(r‘^([0-9]{4})-([0-9]{7})$‘,‘1111-6666666‘)
>>> m
<_sre.SRE_Match object; span=(0, 12), match=‘1111-6666666‘>
>>> m.group(1)
‘1111‘
>>> m.group(0)
‘1111-6666666‘
>>> m.group(2)
‘6666666‘
>>> m.groups()
(‘1111‘, ‘6666666‘)
2.在Regex中遇到一個()就表明是一個分組,,每個()會對後面的字串進行匹配,匹配成功的放入該分組中,在後面我們就可以用group進行截取各分組中匹配的值
注意group(0)表示全部截取,裡面的參數是從0開始的,groups()以元組形式返回所有分組中匹配的值
五、貪婪匹配:
1.對Regex進行分組匹配就會存在貪婪匹配,因為正則匹配預設是貪婪匹配,也就是匹配儘可能多的字元
舉例: >>> m = re.match(r‘^(\d+)(6*)$‘,‘1101016666666‘)
>>> m.groups()
(‘1101016666666‘, ‘‘)
這樣的話第一分組就會將字串全部匹配完,所以第二個分組就是空值
2.我們通過在第一個分組的最後面加一個問號?使得該分組採用非貪婪匹配
舉例: >>> m = re.match(r‘^(\d+?)(6*)$‘,‘1101016666666‘)
>>> m.groups()
(‘110101‘, ‘6666666‘)
六、編譯:
1.當我們在Python中使用Regex時,re模組內部會幹兩件事情:①、編譯Regex,如果Regex的字串本身不合法,會報錯;
②、用編譯後的Regex去匹配字串。
2.如果一個Regex要重複使用幾千次,出於效率的考慮,我們可以先行編譯該Regex,接下來重複使用時就不需要編譯這個步驟了
直接匹配: >>> m = re.compile(r‘^(\d+?)(6*)$‘)
>>> m.match(‘1231313666666‘).groups()
(‘1231313‘, ‘666666‘)
編譯後產生m對象,由於該對象自己包含了Regex,所以調用對應的方法時不用給出正則字串。
七、總結:
對於Regex我覺得可以這樣理解,所謂的匹配就是看需要檢查的字串是否滿足你所寫的正則規則,所謂的正則規則就是你定義的多種情況,比如說[com]*這個正則規則,*表示匹配0次或多次,所以這個正則規則我們可以理解為‘c’,‘com‘,‘co‘,‘om‘,‘comcom‘等多種由c,o,m組合的字串,只要是這些情況都算匹配成功,
而[com]表示的就是(預設1次)只匹配‘com‘而對於前面所說的其他情況都是錯的(注意如果括弧裡是固定字串那麼{n}表示匹配n次,比如(com){2}那麼表示的是一定要匹配comcom才對),我覺得Regex其實就是一個檢查的作用。
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
python中的Regex