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 用正則表達式匹配更多模式
- 括號分組
- phoneNumRegex = re.compile(r'(\d{3})-(\d{3}-\d{4})')
第一對括號是第一組,第二對括號是第二組
- match.group(1): 向group()匹配對象方法傳入1或2,就可以獲得匹配文本的不同部分。傳入0或不傳入參數,將返回整個匹配文本。
- Match.groups(),一次獲取所有的分組-
areaCode,mainNumber = match.groups()
- 如果文本中有() ,需要用\(\) 進行轉譯
7.3.2 管道匹配多個分組
| :管道 ;
- 作用: 希望匹配許多表達式中一個。
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’.
- 還可以指定一個範圍:即在花括號中寫下一個最小值,一個逗號,和一個最大值。(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]將匹配所有元音字符,不論大小寫
- 通過在字符分類的左方括號後加上一個插入字符(^),就可以得到“非字符類”。
》非字符類將匹配不在這個字符類中的所有字符。
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參數,黃色區域,紅色字 被忽略