正規表示式, 簡稱為 regex, 是文字模式的描述方法。python 中所有正規表示式的函式都在 re 模組中,在python中使用正規表示式時都需要匯入re模組,否則就會遇到錯誤訊息 nameerror: name 're' is not defined。
一、建立正規表示式物件
向 re.compile()傳入乙個字串值,表示正規表示式,它將返回乙個 regex 模式物件(或者就簡稱為 regex 物件)。
二、匹配regex 物件
regex 物件的 search()方法查詢傳入的字串, 尋找該正規表示式的所有匹配。如果字串中沒有找到該正規表示式模式, search()方法將返回 none。如果找到了該模式,search()方法將返回乙個 match 物件。 match 物件有乙個 group()方法,它返回被查詢字串中實際匹配的文字。
總之,python 中使用正規表示式有幾個步驟:
1.用 import re 匯入正規表示式模組。
2.用 re.compile()函式建立乙個 regex 物件(記得使用原始字串,即通過在字串的第乙個引號之前加上 r,可以將該字串標記為原始字串,它不包括轉義字元)。
3.向 regex 物件的 search()方法傳入想查詢的字串。它返回乙個 match 物件。
4.呼叫 match 物件的 group()方法,返回實際匹配文字的字串。
#正規表示式查詢**號碼
#coding:utf-8
import re
phonenumregex = re.compile(r'\d\d\d-\d\d\d\d-\d\d\d\d')
mo = phonenumregex.search('my phonenumber is 139-1234-5678.')
print('phone number found: '+mo.group())
#輸出結果
phone number found: 139-1234-5678
三、正規表示式的模式匹配
1、使用括號分組模式匹配
新增括號在正規表示式中建立「 分組」:如上例中的**號碼分組(\d\d\d)-(\d\d\d)-(\d\d\d\d),然後可以使用 group()匹配物件方法,從乙個分組中獲取匹配的文字。正規表示式字串中的第一對括號是第 1 組,第二對括號是第 2 組,依次類推。向 group()匹配物件方法傳入整數,即要匹配文字的組號, 就可以取得匹配文字的不同部分。 向 group()方法傳入 0 或不傳入引數, 將返回整個匹配的文字。如果想要一次就獲取所有的分組, 請使用 groups()方法, 注意函式名的複數形式,groups()返回資料型別為元祖。
#coding:utf-8
import re
phonenumregex = re.compile(r'(\d\d\d)-(\d\d\d\d)-(\d\d\d\d)')
#print(phonenumregex)
mo = phonenumregex.search('my phonenumber is 139-1234-5678.')
print(mo.group(2,3))
print(type(mo.groups()))
#返回結果
('1234', '5678')
如果需要在文字中匹配括號,例如, 你要匹配的**號碼, 可能將區號放在一對括號中。在這種情況下, 就需要用「\」對"("和")"進行字元轉義。
2、用管道(|)匹配多個分組
字元|稱為「 管道」。希望匹配許多表示式中的乙個時, 就可以使用它。
#coding:utf-8
import re
nameregex = re.compile(r'張三|張思')
mo = nameregex.search('張三是我朋友')
print(mo.group())
#輸出結果
張三
上例中正規表示式 『張三|張思』 將匹配 『張三』 或者 『張思』,如果 張三 和 李思 都出現在被查詢的字串中, 第一次出現的匹配文字,將作為 match 物件返回。也可以使用管道來匹配多個模式中的乙個, 作為正規表示式的一部分。
#coding:utf-8
import re
nameregex = re.compile(r'張(三|思)')
mo1 = nameregex.search('張思和張三是我的朋友')
print(mo1.group())
print(mo1.group(1))
#輸出結果
張思
思
輸出結果1:要查詢名字都在被查詢字串中,根據匹配第一次出現的原則,返回張思這個名字。
輸出結果2:mo.group(1)返回第乙個括號分組內(三|思)匹配的文字『思』,使用了按照括號分組的模式匹配。
如果需要匹配真正的管道字元, 就用倒斜槓轉義,即\|。
3、使用問號(?)實現可選匹配
在實際應用中, 想匹配的模式是可選的。即不論這段文字在不在, 正規表示式都會認為匹配。字元?表明它前面的分組在這個模式中是可選的。
4、用星號(*)匹配零次或者多次
*( 稱為星號)意味著「匹配零次或多次」,即星號之前的分組,可以在文字**現任意次。它可以完全不存在,或一次又一次地重複。
5、用加號(+)匹配一次或者多次
*意味著「 匹配零次或多次」, +(加號) 則意味著「 匹配一次或多次」。 星號不要求分組出現在匹配的字串中, 但加號不同, 加號前面的分組必須「 至少出現一次」。這不是可選的。
6、用花括號匹配特定次數
1)如果想要乙個分組重複特定次數,就在正規表示式中該分組的後面,跟上花括號包圍的數字。例如(張三),匹配到的字串為『張三張三張三』。
2)還可以指定乙個範圍,即在花括號中寫下乙個最小值、乙個逗號和乙個最大值。例如(張三),匹配到的字串是「張三」,「張三張三」。
3)也可以不寫花括號中的第乙個或第二個數字, 不限定最小值或最大值。例如(張三)匹配的字串3次或者等多次,(張三)匹配字串0-5次。
python中如何使用正規表示式查詢字串
created on 2019年12月2日 author hp 格式化輸出時,是含有模式串的,同樣的,在python裡面,正規表示式就是作為模式串被使用的 如 匹配乙個不是字母的乙個字串的正規表示式表示的模式字串 a za z 再如 匹配乙個m開頭的單詞 bm w b 上面的模式字串真的正確嗎?事實...
python中如何使用正規表示式的集合字元示例
前言 在正規表示式裡,想匹配一些字元中的乙個,也就是說給出乙個字元的集合,只要出現這個集合裡任意的字元,都是成立的。比如 ab 就是將匹配任意出現a或b的字元。比如a ab 它是貪婪模式,將會匹配所有是a後面的a或b的字串,如abbaabbba。如果要改為非貪婪模式,要在後面新增?如下面的例子 示例...
VB中如何使用正規表示式
vb6.0中 在 專案 中的 referance 中選擇microsoft vbscript regular expression 5.5 確定function regexptest patrn,strng dim regex,retval 建立變 量。set regex new regexp 建立...