正規表示式以及group的用法

不曾走遠~發表於2018-09-11

前言:這裡我只是整理了一些網上的例子,剛好能解決我的疑惑,順便也將學習成果記錄下來。


1、re.match函式

re.match 嘗試從字串的起始位置匹配一個模式,如果不是起始位置匹配成功的話,match()就返回none。

re.match(pattern, string, flags=0)

2、re.search方法

re.search 掃描整個字串並返回第一個成功的匹配。

re.search(pattern, string, flags=0)

re.match只匹配字串的開始,如果字串開始不符合正規表示式,則匹配失敗,函式返回None;而re.search匹配整個字串,直到找到一個匹配。

3、re.findall方法

在字串中找到正規表示式所匹配的所有子串,並返回一個列表,如果沒有找到匹配的,則返回空列表。再次強調是返回是列表,所以當用到findall時,一定注意是直接列印不出來的,要遍歷。

findall(string[, pos[, endpos]])

引數:

  • string : 待匹配的字串。
  • pos : 可選引數,指定字串的起始位置,預設為 0。
  • endpos : 可選引數,指定字串的結束位置,預設為字串的長度。
import re
 
pattern = re.compile(r'\d+')   # 查詢數字
result1 = pattern.findall('runoob 123 google 456')
result2 = pattern.findall('run88oob123google456', 0, 10)
 
print(result1)
print(result2)

結果:
['123', '456']
['88', '12']

4、group的方法

(這部分是轉載於:http://www.cnblogs.com/kaituorensheng/archive/2012/08/20/2648209.html

正規表示式中,group()用來提出分組截獲的字串,()用來分組

import re
a = "123abc456"
print re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(0)   #123abc456,返回整體
print re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(1)   #123
print re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(2)   #abc
print re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(3)   #456

究其因

1. 正規表示式中的三組括號把匹配結果分成三組

  •  group() 同group(0)就是匹配正規表示式整體結果
  •  group(1) 列出第一個括號匹配部分,group(2) 列出第二個括號匹配部分,group(3) 列出第三個括號匹配部分。

2. 沒有匹配成功的,re.search()返回None

3. 當然正規表示式中沒有括號,group(1)肯定不對了

4.1 match.group([group1,…])

import re

#定義了兩個group,因為包含兩個括號
m = re.match("(\w+) (\w+)", "Isaac Newton, physicist")

#group(0)就是匹配的整個結果
print(m.group(0))                           #輸出結果為Isaac Newton

#group(1)是第一個group的值
print(m.group(1))                           #輸出結果為Isaac

#group(2)是第二個group的值
print(m.group(2))                           #輸出結果為Newton


#groups返回所有的group,以元組的形式
print(m.groups())                           #輸出結果為('Isaac','Newton')  

4.2findall(pattern, string, flag)

import re

if __name__ == '__main__':

    #用於測試的字串
    str = "<h1>liuwei</h1><a href='www.baidu.com'></a><h1>zhangbin</h1><a href='www.love.com'></a>"

    regex = re.compile("<h1>(.+?)</h1><a(.+?)></a>")      #定義了兩個group,兩個括號

    res = regex.search(str)                               #search用於找到第一個滿足匹配的子串,並返回                      

    print("group1:%s" %res.group(1))                      #輸出結果為liuwei          
    print("group2:%s" %res.group(2))                      #輸出結果為href='www.baidu.com'

    res1 = regex.findall(str)                             #findall輸出所有滿足的匹配
    print("res1:%s" %res1)               
    #輸出結果 [('liuwei', " href='www.baidu.com'"), ('zhangbin', " href='www.love.com'")]

    print(res1[0])                                        #輸出結果為('liuwei', 'www.baidu.com')
    print(res1[1])                                        #輸出結果為('zhangbin, 'www.love.com')

 

參考資料:

python基礎教程:http://www.runoob.com/python/python-reg-expressions.html

http://www.cnblogs.com/kaituorensheng/archive/2012/08/20/2648209.html

https://blog.csdn.net/jeryjeryjery/article/details/77196497

 

相關文章