python 讓繁瑣工作自動化 第7章-模式匹配與正則表達式

1.import re :導入正則表達式模塊

2.>re.compile() :傳入一個字符串值(正則表達式),返回一個Regex對象.

3.Regex.search() :查找傳入的字符串,尋找該正則表達式的所有匹配。沒有找到該正則表達式模式,返回None;找到,返回一個Match對象。

4.Match.group():返回實際匹配到的文本

re.compile(r'\d{3}-\d{3}-\d{4}'):在字符串的第一個引號之前加上r,可以將該字符串標記爲原始字符串,它不包括轉義字符。

 

7.3 用正則表達式匹配更多模式

  • 括號分組
  1. phoneNumRegex = re.compile(r'(\d{3})-(\d{3}-\d{4})')

第一對括號是第一組,第二對括號是第二組

  1. match.group(1): 向group()匹配對象方法傳入1或2,就可以獲得匹配文本的不同部分。傳入0或不傳入參數,將返回整個匹配文本。
  2. Match.groups(),一次獲取所有的分組-

areaCode,mainNumber = match.groups()

  1. 如果文本中有() ,需要用\(\) 進行轉譯

 

7.3.2 管道匹配多個分組

| :管道 ;

  1. 作用: 希望匹配許多表達式中一個。

heroRegex = re.compile(r'Batman|Tina Fey')

》第一次出現的匹配文本,將作爲match對象返回。

》要返回全部的匹配文本,使用findall() 方法取代search()方法》

》若正則表達式沒有分組,findall()返回字符串列表

》若正則表達式有分組,findall()返回元組列表

 

7.3.3 用?實現可選匹配

可選匹配:可以匹配或不用匹配

? 符號實現該功能

>eg:

phoneRegex = re.compile(r'(\d\d\d-)?\d\d\d-\d\d\d\d')

phoneRegex_m1 = phoneRegex.search('My phone number s 413-222-2332')

print(phoneRegex_m1.group())

phoneRegex_m2 = phoneRegex.search('My phone number is 555-2123')

print(phoneRegex_m2.group())

7.3.4 用*符號匹配0次或多次

即;*符號之前的分組,可以在文本中出現任意次。他可以完全不存在,或一次又一次地重複

br = re.compile(r'Bat(wo)*man')

m1 = br.search('The Adventures of Batman.')

print(m1.group())

 

m2 = br.search('The Adventures of Batwoman.')

print(m2.group())

 

m3 = br.search('The Adventures of Batwowowowoman.')

print(m3.group())

 

7.3.5 用+ 符號 匹配一次或多次

+與*不同的是,+符號前面的分組必須“至少出現一次”。

Eg:

br = re.compile(r'Bat(wo)+man')

m1 = br.search('The Adventures of Batman.')

if m1:

    print(m1.group())

 

m2 = br.search('The Adventures of Batwoman.')

if m2:

    print(m2.group())

 

m3 = br.search('The Adventures of Batwowowowoman.')

if m3:

print(m3.group())

 

7.3.6 用或括號匹配特定次數

1. 在正則表達式中該分組的後面,跟上花括號包圍的數字。

(ha){3} :將匹配字符串‘HaHaHa’,但是不會匹配‘HaHa’.

  1. 還可以指定一個範圍:即在花括號中寫下一個最小值,一個逗號,和一個最大值。(Ha){3,5} 即匹配‘HaHaHa,HaHaHaHa,HaHaHaHaHa’

3.(Ha){3,} 將匹配3次或更多次的實例

(Ha){,5}將匹配0到5次實例

 

7.4 貪心和非貪心匹配

Eg:’HaHaHaHaHaHa’,(Ha){3,5}可以匹配3,4,個。而match對象的group()方法會返回HaHaHaHaHa,而不是更短的可能結果。

》Python的正則表達式默認是貪心的,表示在有二義的情況下,他們可能會匹配最長的字符串。

非貪心版本 在結束的花括號後跟着一個?

(Ha){3,5}?

>eg:

greedy = re.compile(r'(Ha|ha){3,5}')

m = greedy.search('HahahaHaha')

print(m.group())

 

nongreedy = re.compile(r'(Ha|ha){3,5}?')

m2 = nongreedy.search('HahahaHaha')

print(m2.group())

7.6 字符分類

\d 表示 0-9的任何數字 即(0|1|2|3|4|5|6|7|8|9)

\D 除0到9的數字以外的任何字符

\w 任何字母,數字或下劃線字符(可以認爲是匹配“單詞”字符)

\W 除字母,數字和下劃線以外的任何字符

\s 空格,製表符或換行符(可以認爲是匹配“空白”字符)

\S 除空格,製表符,和換行符以外的任何字符

Eg:

rg = re.compile(r'\d+\s\w+')

m = rg.findall('12 drummers, 11 pipers 10 lords,9 ladies')

print(m)

 

7.7 建立自己的字符分類

Syntax : [] 定義自己的字符分類

Eg:>[aeiouAEIOU]將匹配所有元音字符,不論大小寫

  1. 通過在字符分類的左方括號後加上一個插入字符(^),就可以得到“非字符類”。

》非字符類將匹配不在這個字符類中的所有字符。

7.8 插入字符和美元字符

插入符號 ^ :在正則表達式的開始處使用插入符號 ^, 表明匹配必須發生在被查找文本的開始處。

美元符號:$:表明該字符串必須以這個正則表達式的模式結束。

若同時使用^,$,表明整個字符串必須匹配該模式。

Eg:

beginWithHello = re.compile(r'^Hello')

m1 = beginWithHello.search('oh my god Hello World.')

m2 = beginWithHello.search('Hello, world.')

if m1:

    print('m1 :'+ m1.group())

if m2:

print('m2 :' + m2.group())

只運行 m2: hello.

 

>r’^\d+$’:匹配以數字0到9結束的字符串

7.9 通配字符

. (句點) :匹配除了換行之外的所有字符。

》句點字符只匹配一個字符。

7.9.1 點-星匹配所有字符

(.*) 表示任意文本-包括括號

.* 使用貪心模式;.*? 非貪心模式

1》 re.compile(‘.*’,re.DOTALL) 通過給re.compile()傳入第二個參數re.DOTALL,可以將.*字符匹配所有字符。

 

7.10 正則表達式符號複習

》? 匹配0次或一次前面的分組

》*匹配0次或多次前面的分組

》+匹配一次或多次前面的分組

》{n}匹配n次前面的分組

》{n,}匹配n次或更多前面的分組

》{,m}屁屁0次到m次前面的分組

》{n,m}匹配至少n次,至多m次前面的分組

》{n,m}?進行非貪心匹配,匹配n次

》^spam :意味着 字符串必須以spam開始

》spam$ 意味着字符串必須以spam結束

\d, \w,\s 分別匹配數字,單詞,空格

》\D,\W,\S 分別匹配除數字,單詞,空格以外 的所有字符

》[a,b,c]匹配方括號內的任意字符

》[^abc]:匹配不在方括號內的任意字符

 

7.11 不區分大小寫的匹配

向re.compile()傳入re.IGNORECASE 或re.I作爲第二個參數,讓正則表達式不區分大小寫。

7.12 用sub()方法替換字符串

>sub()返回替換完成後的字符串

7.13 管理複雜的正則表達式

忽略正則表達式字符串中的空白符和註釋,向re.compile()傳入變量re.VERBOSE,作爲第二個參數。

》re.compile(’’’ ’’’)三重引號,創建一個多行字符串。

可以將正則表達式定義放在多行中,讓它可以讀。

phoneRegex = re.compile(r'''

    (\d{3}|\(\d{3}\))?  #Area code

    (\s|-|.)?           #separator

    (\d{3})             #3 digits

    (\s|-|.)            #separator

    (\d{4})             #last 4 digits

    ((\s*|ext|x|ext\.|)\s*(\d{2,5}))?   #extension

''',re.VERBOSE)

通過使用re.VERBOSE參數,黃色區域,紅色字 被忽略

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章