1. 程式人生 > >正則表示式的匹配符

正則表示式的匹配符

正則表示式

動機 :

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
功能:同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'