正則表示式的匹配符
阿新 • • 發佈:2018-11-10
正則表示式
動機 :
1. 處理文字稱為計算機主要工作之一
2. 根據文字內容進行固定搜尋是文字處理的常見工作
3. 為了快速方便的處理上述問題,正則表示式技術誕生,逐漸發展為一個單獨技術被眾多語言使用
定義 : 即高階文字匹配模式,提供了搜尋,替代等功能,本質是由一些字元和特殊符號組成的字串。這個字串描述了字元和字元的重複行為,可以匹配某一類特
徵的字串集合。
目標 :
1.熟練正則表示式符號和用法
2.能夠正確的理解和簡單使用正則表示式進行匹配
3.能夠使用python re模組操作正則表示式
正則特點:
* 方便進行檢索和修改 * 支援語言眾多 * 使用靈活變化多樣 * 文字處理,mongo儲存某一型別字串,django、tornado路由,爬蟲文字匹配
正則的規則和用法
import re
re.findall(regex,string)
功能 : 使用正則表示式匹配字串
引數 : regex : 正則表示式
string : 目標字串
返回值 : 匹配到的內容
元字元 (即正則表示式中有特殊含義的字元)
* 普通字元
元字元 : abc
匹配規則 : 匹配相應的普通字元
e.g. ab ----》 abcdef : ab
In [3]: re.findall('ab','abcdefabcde')
Out[3]: ['ab', 'ab']
* 使用 或 多個正則同時匹配
元字元 : |
匹配規則:符號兩側的正則均能匹配
e.g. ab|cd ---》 abcdefgh : ab cd
In [5]: re.findall('ab|fg','abcdefgabcde')
Out[5]: ['ab', 'fg', 'ab']
##* 匹配單一字元
元字元 : .
匹配規則: 匹配任意一個字元 '\n'除外
e.g. f.o ---》 foo fuo fao [email protected]
In [7]: re.findall('f.o','affooasand [email protected],')
Out[7]: ['ffo', '[email protected]']
*匹配字串開頭
元字元 : ^
匹配規則: 匹配一個字串的開頭位置
e.g. ^Hello ---> Hello world : Hello
*匹配字串結尾
元字元: $ 匹配規則: 匹配一個字串的結尾位置 e.g. py$ ----> hello.py : py In [10]: re.findall('py$','hello.py') Out[10]: ['py']
*匹配重複0次或多次
元字元: *
匹配規則:匹配前面出現的正則表示式 0次或者多次
e.g. ab* a ab abbbb
*匹配重複1次或多次
元字元 : +
匹配規則: 匹配前面正則表示式至少一次
e.g ab+ ab abbbbb
In [29]: re.findall('.+\.py$','a.py')
Out[29]: ['a.py']
* 匹配重複0次或1次
元字元: ?
匹配規則 : 匹配前面出現的正則表示式0次或1次
e.g. ab? a ab
In [34]: re.findall('ab?','abcdeabasdfabbbbbb')
Out[34]: ['ab', 'ab', 'a', 'ab']
* 匹配重複指定次數
元字元 : {N}
匹配規則 : 匹配前面的正則表示式N次
e.g. ab{3} abbb
*匹配重複指定次數範圍
元字元 : {M,N}
匹配規則 : 匹配前面的正則表示式 m次到n次
e.g ab{3,5} abbb abbbb abbbbb
In [39]: re.findall('ab{2,5}','abbcdeabbbabsdfabbbbbb')
Out[39]: ['abb', 'abbb', 'abbbbb']
* 字符集匹配
元字元 : [abcd]
匹配規則 : 匹配中括號中的字符集,或者是字符集區間 的一個字元
e.g. [abcd] ----》 a b c d
[0-9] ---> 1 3 4 7 匹配任意一個數字字元
[A-Z] ---》 A D H 匹配任意一個大寫字元
[a-z] ---》 a d f h 匹配任意一個小寫字元
多個字符集形式可以寫在一起
[+-*/0-9a-g] + - * / 4 b
In [42]: re.findall('^[A-Z][0-9a-z]{5}','Hello1 Join')
Out[42]: ['Hello1']
* 字符集不匹配
元字元 : [^ ...]
匹配規則 : 匹配出字符集中字元的任意一個字元
e.g. [^abcd] -> e f & #
[^0-9] -> a d g
In [48]: re.findall('[^_0-9a-zA-Z]','[email protected]')
Out[48]: ['@', '.']
* 匹配任意數字(非數字)字元
元字元 : \d [0-9] \D [^0-9]
匹配規則: \d 匹配任意一個數字字元 \D 匹配任意非數字字元
In [49]: re.findall('1\d{10}','15100317766')
Out[49]: ['15100317766']
* 匹配任意普通字元(特殊字元)
元字元 : \w [_0-9a-zA-Z] \W [^_0-9a-zA-Z]
匹配規則 : \w 匹配數字字母下劃線 \W 除了數字字母下劃線
* 匹配任意 (非)空字元
元字元 : \s \S
匹配規則: \s 任意空字元 [ \n\0\t\r] 空格 換行 回車 製表
\S 任意非空字元
In [61]: re.findall('hello\s+\S+','hello l&#l hello lucy hellokadfh')
Out[61]: ['hello l&#l', 'hello lucy']
* 匹配字串開頭結尾
元字元 : \A ^ \Z $
匹配規則: \A 表示匹配字串開頭位置
\Z 表示匹配字串的結尾位置
e.g. \Aabc\Z ---> abc
* 匹配(非)單詞邊界
元字元: \b \B
匹配規則 \b 匹配一個單詞的邊界
\B 匹配一個單詞的非邊界
數字字母下劃線和其他字元的交界處認為是單詞邊界
is "This is a test"
In [71]: re.findall(r'\bis\b','This is a test')
Out[71]: ['is']
元字元總結
字元: 匹配實際字元
匹配單個字元 : . \d \D \w \W \s \S [...] [^...]
匹配重複次數 : * + ? {N} {M,N}
匹配字串位置 : ^ $ \A \Z \b \B
其他 : |
r字串和轉義
轉義 : . * ? $ "" '' [] () {} \
r ---> 將字串變為 raw 字串
不進行字串的轉義
兩種等價的寫法
In [87]: re.findall(r'\? \* \\','what? * \\')
Out[87]: ['? * \\']
In [88]: re.findall('\\? \\* \\\\','what? * \\')
Out[88]: ['? * \\']
貪婪和非貪婪
和重複元字元相關
* + ?{m,n}
貪婪模式 :
在使用重複元字元的時候(* + ?{m,n}),元字元的匹配總是儘可能多的向後匹配更多內容,即為貪婪模式。貪婪模式是一種預設情況
e.g. 儘可能多的匹配b
In [90]: re.findall('ab+','abbbbbbalksdjfab')
Out[90]: ['abbbbbb', 'ab']
非貪婪模式 :
儘可能少的匹配內容,只要滿足正則條件即可
貪婪 ---》 非貪婪 *? +? ?? {m,n}?
儘量少匹配
In [95]: re.findall('ab*?','abbbbbbalksdjfab')
Out[95]: ['a', 'a', 'a']
In [96]: re.findall('ab+?','abbbbbbalksdjfab')
Out[96]: ['ab', 'ab']
正則表示式的分組
使用()為正則表示式分組
((ab)cd(ef)) : 表示給ab分了一個子組
1. 正則表示式的子組用()表示,增加子組後對整體的匹配沒有影響
2. 每個正則表示式可以有多個子組,子組由外到內由左到右為第一第二第三。。。。。。子組
3. 子組表示一個內部整體,很多函式可以單獨提取子組的值
In [108]: re.match('(ab)cdef','abcdefghig').group(1)
Out[108]: 'ab'
4. 子組可以改變 重複行為,將子組作為一個整體重複
In [111]: re.match('(ab)*','ababababab').group()
Out[111]: 'ababababab'
捕獲組和非捕獲組 (命名組和非命名組)
格式 : (?P<name>regex)
(?P<word>ab)cdef
某些函式可以通過名字提取子組內容,或者通過名字進行鍵值對的生成。
In [112]: re.match('(?P<word>ab)cdef','abcdefghi').group()
Out[112]: 'abcdef'
起了名字的子組可以通過名稱重複使用
(?P=name)
In [114]: re.match('(?P<word>ab)cd(?P=word)','abcdabdfewf').group()
Out[114]: 'abcdab'
re模組
compile(pattern, flags=0)
功能 : 獲取正則表示式物件
引數 : pattern 正則表示式
flags 功能標誌位 提供正則表示式結果的輔助功能
返回值:返回相應的正則物件
* compile 函式返回值的屬性函式 和 re模組屬性函式有相同的部分
相同點:
*功能完全相同
不同點:
compile返回值物件屬性函式引數中沒有pattern和flags部分,因為這兩個引數內容在compile生成物件時已經指明,而re模組直接呼叫這些函式時則需要傳入
compile返回值物件屬性函式引數中有pos 和 endpos引數,可以指明匹配目標字串的起始位置,而re模組直接呼叫這些函式時是沒有這個
findall(string,pos ,endpos)
功能 : 將正則表示式匹配到的內容存入一個列表返回
引數 : 要匹配的目標字串
返回值: 返回匹配到的內容列表
* 如果正則表示式中有子組,則返回子組的匹配內容
split()
功能: 以正則表示式切割字串
返回值 : 分割後的內容放入列表
sub(pattern,re_string,string,count)
功能:用目標字串替換正則表示式匹配內容
引數:re_string 用什麼來替換
string 要匹配的目標字串
max 最多替換幾處
返回值 : 返回替換後的字串
subn()
功能 : 同sub
引數 : 同sub
返回值 : 比sub多一個實際替換的個數
groupindex : compile物件屬性 得到捕獲組名和第幾組數字組成的字典
groups: compile屬性,得到一共有多少子組
finditer()
功能 : 同findall 查詢所有正則匹配到的內容
引數:同findall
返回值 : 返回一個迭代器,迭代的每一項都是一個matchobj
match(pattern, string, flags=0)
功能:匹配一個字串開頭的位置
引數:目標字串
返回值 : 如果匹配到返回 一個match obj
沒匹配到返回None
search
功能:同match 只是可以匹配任意位置,只能匹配一處
引數:目標字串
返回值 : 如果匹配到返回 一個match obj
沒匹配到返回None
fullmatch()
要求目標字串能夠被正則表示式完全匹配
In [12]: obj = re.fullmatch('\w+','abcd2')
In [13]: obj.group()
Out[13]: 'abcd2'
match 物件屬性及函式
'end'
'endpos'
'group'
'groupdict'
'groups'
'lastgroup'
'lastindex'
'pos'
're',
'span'
'start'