正規表示式的各種方法

2021-10-25 18:58:32 字數 3995 閱讀 3668

所有內容均參考python變成快速上手一書

python的所有正規表示式都在re模組中。

向re.compile()傳入乙個字串,表示正規表示式,它將返回乙個regex模式物件

h1 = re.compile(r'\d\d\d-\d\d\d-\d\d\d\d')

mo = h1.search('my phone is 415-555-4242')

print(mo.group())

輸出結果:

415-555-4242

h1 = re.compile(r'(\d\d\d)-(\d\d\d-\d\d\d\d)')

mo = h1.search('my phone is 415-555-4242')

print(mo.group(1))

print(mo.group(2))

print(mo.group(0))

print(mo.group())

輸出結果:

415555-4242

415-555-4242

415-555-4242

字元|被稱為管道。希望匹配多個表示式中的乙個,若多個表示式均出現,則第乙個被匹配的作為返回物件(可以用findall()方法找到所有匹配物件)

h1 = re.compile(r'tom|tim|jim')

mo = h1.search('tim is tom')

print(mo.group())

輸出:tim

字元?表明他前面的分組在這個模式中是可選的(可存在可不存在)(可以理解為匹配這個問號之前的元組零次或者一次)

h1 = re.compile(r'tom(tim)?jim')

mo = h1.search('tomjimm')

mo1 = h1.search('tomtimjim')

print(mo.group())

print(mo1.group())

輸出:timtom

tomtimjim

*號表示「匹配零次或者多次」,即在*號之前的元組可以出現任意次。(如果想匹配真正的*號需要在*號前加上反斜槓\)

h1 = re.compile(r'tom(tim)*jim')

mo = h1.search('tomjimm')

mo1 = h1.search('tomtimjim')

mo2 = h1.search('tomtimtimtimtimjim')

print(mo.group())

print(mo1.group())

print(mo2.group())

輸出:timtom

tomtimjim

tomtimtimtimtimjim

+號意味著」匹配一次或者多次「,與*號不同的是+號前面的元組必須出現至少一次

h1 = re.compile(r'tom(tim)+jim')

mo = h1.search('tomjimm')

mo1 = h1.search('tomtimjim')

mo2 = h1.search('tomtimtimtimtimjim')

print(mo.group())

print(mo1.group())

print(mo2.group())

輸出:報錯

tomtimjim

tomtimtimtimtimjim

{}中的引數可以為乙個數字,:表示出現n次;也可以有多個數字:表示可以出現在這個範圍中均可以,即[n,m],當引數n不傳入時,表示[0,m],即0到m次,當引數m不傳入時,表示[n,無窮],即至少出現n次。

注意:此時涉及到貪心和非貪心匹配,因為表示出現3,4,5次,這時候會匹配哪乙個?python的預設正規表示式時」貪心「的,這表示在同時存在多個時,會優先匹配最長的字串,」非貪心「匹配最短的字串,即在花括號最後面加上?號

h1 = re.compile(r'a')

mo1 = h1.search('aaaaa')

print(mo.group())

h2 = re.compile(r'a?')

mo2 = h2.search('aaaaa')

print(mo2.group())

輸出:aaaaa

aaa

除了search()方法,還有乙個findall()方法。search()方法是返回乙個物件,即第一次匹配的文字,而findall()方法返回一組字串,包含所有被匹配的文字。findall()返回的是乙個字串列表, 如果正規表示式中有分組,則findall()返回元組的列表

h1 = re.compile(r'\d\d-\d')

mo1 = h1.search('my m:11-2,you m:22-3')

print(mo.group())

輸出:11-2

h1 = re.compile(r'\d\d-\d')

h1.findall('my m:11-2,you m:22-3')

輸出:['11-2','22-3']

h1 = re.compile(r'(\d\d)-(\d)')

h1.findall('my m:11-2,you m:22-3')

輸出:[('11','2'),('22','3')]

前面的例子可以知道\d表示任何數字,即0~9。

\d       0到9的任何數字

\d       除了0到9的任何字元

\w        任何字母,數字或者下劃線字元(可以認為是匹配」單詞「字元)

\w       除字母,數字和下劃線以外的任意字元

\s         空格,製表符或者換行符(可以認為匹配」空白「字元)

\s        除空格,製表符和換行符以外的任意字元

有時候匹配一段字串,而字元分類太過廣泛,可以用方括號定義自己的字元分類。也可以用橫線-表示字母或者數字的範圍(a-za-z0-9將匹配所有小寫字母,大寫字母和數字)在方括號內的正規表示式不會被解釋,意味著不用在前面加上反斜槓轉義,例如匹配0到5和乙個句點.此時就不需要將它寫成[0-5\.];通過在方括號的開頭加上乙個插入字元^,就可以得到不在這個字元類中的字元。

h1 = re.compile(r'[abcdefg]')

h1.findall('aabbkzggd')

輸出:['a','a','b','b','g','g','d']

h1 = re.compile(r'[^abcdefg]')

h1.findall('aabbkzggd')

輸出:['k','z']

在正規表示式的開始處加上乙個插入字元^,表明匹配必須發生在被查詢文字的開始處。類似的,在末尾加上美元符號$,表示必須以這個正規表示式的模式結束,這兩個字元也可以同時使用,表明該字串必須匹配該模式,也就是說,只匹配該字串的乙個子類是不行的。

h1 = re.compile(r'^hello')

h1.search('hello')

輸出:h1 = re.compile(r'^hello')

h1.search('hell') == none

輸出:true

通配字元.(句點)可以匹配除了換行符之外的所有字元(句點字元只匹配乙個字元)

要想匹配所有字串,則可以使用re.complie(r'.*?')(可以自行選擇使用貪心或者非貪心模式)

點-星將匹配除換行符外的所有字元,通過傳入re.dotall作為re.complie()的第二個引數,就可以匹配所有字串,包括換行字元

通常,正規表示式用你指定的大小寫匹配文字,要想匹配時不區分大小寫,可以向re.complie()中傳入re.ignorecase或者re.i作為第二個引數

sub()方法需要傳入兩個引數,第乙個引數是要替換成的字串,第二個為傳入的字串,用正規表示式匹配內容

js正規表示式有關的各種方法

用正規表示式模式在字串中執行查詢,並返回包含該查詢結果的乙個陣列。rgexp.exec str 引數rgexp 必選項。包含正規表示式模式和可用標誌的正規表示式物件。str 必選項。要在其中執行查詢的string物件或字串文字。說明如果exec方法沒有找到匹配,則它返回null。如果它找到匹配,則e...

各種正規表示式

1.由數字 26個英文本母或者下劃線組成的字串 0 9a za z 2.非負整數 正整數 0 d 3.正整數 0 9 1 9 0 9 4.非正整數 負整數 0 d 0 5.負整數 0 9 1 9 0 9 6.整數 d 7.非負浮點數 正浮點數 0 d d 8.正浮點數 0 9 0 9 1 9 0 9...

各種正規表示式

今天在逛貼時看到了關於正規表示式的分享,現在將其摘錄,也方便自己日後檢視 一 校驗數字的表示式 1 數字 0 9 2 n位的數字 d 3 至少n位的數字 d 4 m n位的數字 d 5 零和非零開頭的數字 0 1 9 0 9 6 非零開頭的最多帶兩位小數的數字 1 9 0 9 0 9 7 帶1 2位...