1. 程式人生 > >Python進階(十六)-正則表示式

Python進階(十六)-正則表示式

分享一下我的偶像大神的人工智慧教程!http://blog.csdn.net/jiangjunshow

也歡迎轉載我的文章,轉載請註明出處 https://blog.csdn.net/mm2zzyzzp

Python進階(十六)-正則表示式

  正則表示式是一個特殊的字元序列,它能幫助你方便的檢查一個字串是否與某種模式匹配。
  Python 自1.5版本起增加了re 模組,它提供 Perl 風格的正則表示式模式。
  在python中使用正則表示式,需要引入re模組;下面介紹下該模組中的一些方法;

compile和match

  re模組中compile用於生成pattern的物件,再通過呼叫pattern例項的match方法處理文字最終獲得match例項;通過使用match獲得資訊;

import re

# 將正則表示式編譯成Pattern物件
pattern = re.compile(r'rlovep')
# 使用Pattern匹配文字,獲得匹配結果,無法匹配時將返回None
m = pattern.match('rlovep.com')
if m:
# 使用Match獲得分組資訊
    print(m.group())
### 輸出 ###
# rlovep
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

  re.compile(strPattern[, flag]):
  這個方法是Pattern類的工廠方法,用於將字串形式的正則表示式編譯為Pattern物件。第二個引數flag是匹配模式,取值可以使用按位或運算子’|’表示同時生效,比如re.I | re.M。另外,你也可以在regex字串中指定模式,比如re.compile(‘pattern’, re.I | re.M)與re.compile(‘(?im)pattern’)是等價的。
  可選值有:

  • re.I(re.IGNORECASE): 忽略大小寫(括號內是完整寫法,下同)
  • M(MULTILINE): 多行模式,改變’^’和’$’的行為
  • S(DOTALL): 點任意匹配模式,改變’.’的行為
  • L(LOCALE): 使預定字元類 \w \W \b \B \s \S 取決於當前區域設定
  • U(UNICODE): 使預定字元類 \w \W \b \B \s \S \d \D 取決於unicode定義的字元屬性
  • X(VERBOSE): 詳細模式。這個模式下正則表示式可以是多行,忽略空白字元,並可以加入註釋。

Match

  Match物件是一次匹配的結果,包含了很多關於此次匹配的資訊,可以使用Match提供的可讀屬性或方法來獲取這些資訊。
  屬性:

  • string: 匹配時使用的文字。
  • re: 匹配時使用的Pattern物件。
  • pos: 文字中正則表示式開始搜尋的索引。值與Pattern.match()和Pattern.seach()方法的同名引數相同。
  • endpos: 文字中正則表示式結束搜尋的索引。值與Pattern.match()和Pattern.seach()方法的同名引數相同。
  • lastindex: 最後一個被捕獲的分組在文字中的索引。如果沒有被捕獲的分組,將為None。
  • lastgroup: 最後一個被捕獲的分組的別名。如果這個分組沒有別名或者沒有被捕獲的分組,將為None。

方法:

group([group1, …])

  獲得一個或多個分組截獲的字串;指定多個引數時將以元組形式返回。group1可以使用編號也可以使用別名;編號0代表整個匹配的子串;不填寫引數時,返回group(0);沒有截獲字串的組返回None;截獲了多次的組返回最後一次截獲的子串。

groups([default]):

  以元組形式返回全部分組截獲的字串。相當於呼叫group(1,2,…last)。default表示沒有截獲字串的組以這個值替代,預設為None。

groupdict([default])

返回以有別名的組的別名為鍵、以該組截獲的子串為值的字典,沒有別名的組不包含在內。default含義同上。

start([group])

  返回指定的組截獲的子串在string中的起始索引(子串第一個字元的索引)。group預設值為0。

end([group])

  返回指定的組截獲的子串在string中的結束索引(子串最後一個字元的索引+1)。group預設值為0。

span([group])

  返回(start(group), end(group))。

expand(template)

  將匹配到的分組代入template中然後返回。template中可以使用\id或\g、 \g引用分組,但不能使用編號0。\id與\g是等價的;但\10將被認為是第10個分組,如果你想表達 \1之後是字元’0’,只能使用\g<1>0。

pattern

  Pattern物件是一個編譯好的正則表示式,通過Pattern提供的一系列方法可以對文字進行匹配查詢。
  Pattern不能直接例項化,必須使用re.compile()進行構造。
  Pattern提供了幾個可讀屬性用於獲取表示式的相關資訊:

  • pattern: 編譯時用的表示式字串。
  • flags: 編譯時用的匹配模式。數字形式。
  • groups: 表示式中分組的數量。
  • groupindex: 以表示式中有別名的組的別名為鍵、以該組對應的編號為值的字典,沒有別名的組不包含在內。

例項方法[ | re模組方法]:

match(string[, pos[, endpos]]) | re.match(pattern, string[, flags])

  這個方法將從string的pos下標處起嘗試匹配pattern;如果pattern結束時仍可匹配,則返回一個Match物件;如果匹配過程中pattern無法匹配,或者匹配未結束就已到達endpos,則返回None。
pos和endpos的預設值分別為0和len(string);re.match()無法指定這兩個引數,引數flags用於編譯pattern時指定匹配模式。
  注意:這個方法並不是完全匹配。當pattern結束時若string還有剩餘字元,仍然視為成功。想要完全匹配,可以在表示式末尾加上邊界匹配符’$’。

search(string[, pos[, endpos]]) | re.search(pattern, string[, flags])

  這個方法用於查詢字串中可以匹配成功的子串。從string的pos下標處起嘗試匹配pattern,如果pattern結束時仍可匹配,則返回一個Match物件;若無法匹配,則將pos加1重新嘗試匹配;直到pos=endpos時仍無法匹配則返回None。 pos和endpos的預設值分別為0和len(string));re.search()無法指定這兩個引數,引數flags用於編譯pattern時指定匹配模式。

split(string[, maxsplit]) | re.split(pattern, string[, maxsplit])

  按照能夠匹配的子串將string分割後返回列表。maxsplit用於指定最大分割次數,不指定將全部分割。

findall(string[, pos[, endpos]]) | re.findall(pattern, string[, flags])

  搜尋string,以列表形式返回全部能匹配的子串。

finditer(string[, pos[, endpos]]) | re.finditer(pattern, string[, flags])

  搜尋string,返回一個順序訪問每一個匹配結果(Match物件)的迭代器。

sub(repl, string[, count]) | re.sub(pattern, repl, string[, count])

  使用repl替換string中每一個匹配的子串後返回替換後的字串。 當repl是一個字串時,可以使用\id或\g、\g引用分組,但不能使用編號0。 當repl是一個方法時,這個方法應當只接受一個引數(Match物件),並返回一個字串用於替換(返回的字串中不能再引用分組)。 count用於指定最多替換次數,不指定時全部替換。

subn(repl, string[, count]) |re.sub(pattern, repl, string[, count])

  返回 (sub(repl, string[, count]), 替換次數)。

re.match函式

  re.match 嘗試從字串的起始位置匹配一個模式,如果不是起始位置匹配成功的話,match()就返回none。
  函式語法:
  re.match(pattern, string, flags=0)
  函式引數說明:
這裡寫圖片描述
匹配成功re.match方法返回一個匹配的物件,否則返回None。
我們可以使用group(num) 或 groups() 匹配物件函式來獲取匹配表示式。
這裡寫圖片描述

例項 1

#!/usr/bin/python
# -*- coding: UTF-8 -*- 

import re
print(re.match('www', 'www.runoob.com').span())  # 在起始位置匹配
print(re.match('com', 'www.runoob.com'))         # 不在起始位置匹配
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

  以上例項執行輸出結果為:
  (0, 3)
  None

例項 2

#!/usr/bin/python3
import re

line = "Cats are smarter than dogs"

matchObj = re.match( r'(.*) are (.*?) .*', line, re.M|re.I)

if matchObj:
   print ("matchObj.group() : ", matchObj.group())
   print ("matchObj.group(1) : ", matchObj.group(1))
   print ("matchObj.group(2) : ", matchObj.group(2))
else:
   print ("No match!!")
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

  以上例項執行結果如下:
  matchObj.group() : Cats are smarter than dogs
  matchObj.group(1) : Cats
  matchObj.group(2) : smarter

re.search方法

  re.search 掃描整個字串並返回第一個成功的匹配。
  函式語法:
  re.search(pattern, string, flags=0)
  函式引數說明:
這裡寫圖片描述
匹配成功re.search方法返回一個匹配的物件,否則返回None。
我們可以使用group(num) 或 groups() 匹配物件函式來獲取匹配表示式。
這裡寫圖片描述

例項一

import re
print(re.search("rlovep","rlovep.com").span())
print(re.search("com","http://rlovep.com").span())
  
  • 1
  • 2
  • 3

例項二

import re
line = "This is my blog"
#匹配含有is的字串
matchObj = re.search( r'(.*) is (.*?) .*', line, re.M|re.I)
#使用了組輸出:當group不帶引數是將整個匹配成功的輸出
#當帶引數為1時匹配的是最外層左邊包括的第一個括號,一次類推;
if matchObj:
    print ("matchObj.group() : ", matchObj.group())#匹配整個
    print ("matchObj.group(1) : ", matchObj.group(1))#匹配的第一個括號
    print ("matchObj.group(2) : ", matchObj.group(2))#匹配的第二個括號
else:
    print ("No match!!")
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

  輸出:
  matchObj.group() : This is my blog
  matchObj.group(1) : This
  matchObj.group(2) : my

search和match區別

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

例項

#!/usr/bin/python3

import re

line = "Cats are smarter than dogs";

matchObj = re.match( r'dogs', line, re.M|re.I)
if matchObj:
   print ("match --> matchObj.group() : ", matchObj.group())
else:
   print ("No match!!")

matchObj = re.search( r'dogs', line, re.M|re.I)
if matchObj:
   print ("search --> matchObj.group() : ", matchObj.group())
else:
   print ("No match!!")
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

  以上例項執行結果如下:
  No match!!
  search –> matchObj.group() : dogs

檢索和替換

  Python 的re模組提供了re.sub用於替換字串中的匹配項。
  語法:
  re.sub(pattern, repl, string, count=0)
  引數:

  • pattern : 正則中的模式字串。
  • repl : 替換的字串,也可為一個函式。
  • string : 要被查詢替換的原始字串。
  • count : 模式匹配後替換的最大次數,預設 0 表示替換所有的匹配。

例項

#!/usr/bin/python3
import re

phone = "2004-959-559 # 這是一個電話號碼"

# 刪除註釋
num = re.sub(r'#.*$', "", phone)
print ("電話號碼 : ", num)

# 移除非數字的內容
num = re.sub(r'\D', "", phone)
print ("電話號碼 : ", num) 
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

  以上例項執行結果如下:
  電話號碼 : 2004-959-559
  電話號碼 : 2004959559
  repl 引數是一個函式
  以下例項中將字串中的匹配的數字乘於 2:

#!/usr/bin/python

import re

# 將匹配的數字乘於 2
def double(matched):
    value = int(matched.group('value'))
    return str(value * 2)

s = 'A23G4HFD567'
print(re.sub('(?P<value>\d+)', double, s))
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

  執行輸出結果為:
  A46G8HFD1134

正則表示式修飾符 - 可選標誌

  正則表示式可以包含一些可選標誌修飾符來控制匹配的模式。修飾符被指定為一個可選的標誌。多個標誌可以通過按位 OR(|) 它們來指定。如 re.I | re.M 被設定成 I 和 M 標誌:
這裡寫圖片描述

正則表示式模式

  模式字串使用特殊的語法來表示一個正則表示式:

  • 字母和數字表示他們自身。一個正則表示式模式中的字母和數字匹配同樣的字串。
  • 多數字母和數字前加一個反斜槓時會擁有不同的含義。
  • 標點符號只有被轉義時才匹配自身,否則它們表示特殊的含義。
  • 反斜槓本身需要使用反斜槓轉義。
  • 由於正則表示式通常都包含反斜槓,所以你最好使用原始字串來表示它們。模式元素(如 r’/t’,等價於’//t’)匹配相應的特殊字元。

  下表列出了正則表示式模式語法中的特殊元素。如果你使用模式的同時提供了可選的標誌引數,某些模式元素的含義會改變。
這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述

正則表示式例項

字元匹配
這裡寫圖片描述
這裡寫圖片描述

參考資料

  http://www.runoob.com/python3/python3-reg-expressions.html

給我偶像的人工智慧教程打call!http://blog.csdn.net/jiangjunshow