python之正則表示式的使用
阿新 • • 發佈:2022-03-01
一、re模組的使用
python中使用正則表示式,需要用到re模組來進行操作,Re庫常用的功能函式
1、re.match函式
引數說明:接收兩個引數,
- 第一個是匹配的規則,
- 第二個是匹配的目標字串,
re.match嘗試從字串的起始位置匹配一個模式,匹配成功 返回的是一個匹配物件(這個物件包含了我們匹配的資訊),如果不是起始位置匹配成功的話,match()返回的就是空。
import re s = '12356python123456' print(re.match(r'123',s)) print(re.match(r'1236',s)) print(re.match(r'1234',s)) print(re.match(r'python',s)) 列印結果: <_sre.SRE_Match object; span=(0, 3), match='123'> None None None
2、re.search方法
引數說明:接收兩個引數,
- 第一個是匹配的規則,
- 第二個是匹配的目標字串,
re.search 掃描整個字串並返回第一個成功的匹配.【匹配多個符合要求的字元,只返回第一個滿足條件的】
import re s = '12356python123456' print(re.search(r'123',s)) print(re.search(r'1236',s)) print(re.search(r'1234',s)) print(re.search(r'python',s)) 列印結果: <_sre.SRE_Match object; span=(0, 3), match='123'> None <_sre.SRE_Match object; span=(11, 15), match='1234'> <_sre.SRE_Match object; span=(5, 11), match='python'> Process finished with exit code 0
re.match與re.search的區別
re.match從字串的開始位置進行匹配,如果字串開始不符合正則表示式,則匹配失敗,函式返回空;
而re.search匹配整個字串,直到找到一個匹配成功的則進行返回,如果整個字串中都沒有找到匹配成功的,則返回空
3、findall方法
引數說明:接收兩個引數,
- 第一個是匹配的規則,
- 第二個是匹配的目標字串,
在字串中找到正則表示式所匹配的所有子串,並返回一個列表,如果沒有找到匹配的,則返回空列表。
import re s = '12356python123456' print(re.findall(r'123', s)) # ['123', '123'] print(re.findall(r'1236', s)) # [] print(re.findall(r'1234', s)) # ['1234'] print(re.findall(r'python', s)) # ['python']
注意: match 和 search 是匹配一個結果, findall 匹配處所有符合規則的結果。
4、sub方法
替換字串中的某些字元,可以用正則表示式來匹配被選子串。
re.sub(pattern,repl,string,count=0)
引數:
- pattern:匹配的規則;
- repl:匹配之後替換的新內容;
- string:需要按規則替換的字串;
- count:替換的次數,可以不傳參,預設替換所有符合規則的。
import re s = '12356python123456python' print(re.sub(r'python','PYTHON', s)) # 12356PYTHON123456PYTHON print(re.sub(r'python','PYTHON', s,1)) # 12356PYTHON123456python print(re.sub(r'python','PYTHON', s,2)) # 12356PYTHON123456PYTHON
5、貪婪模式說明:
貪婪模式:Python裡數量詞預設是貪婪的,總是嘗試匹配儘可能多的字元;
import re s = '12356python123456python' # {m,n}表示n>m,匹配的位數 print(re.search(r'\d{3,}', s)) # <_sre.SRE_Match object; span=(0, 5), match='12356'> print(re.search(r'\d{3,3}', s)) # <_sre.SRE_Match object; span=(0, 3), match='123'> print(re.search(r'\d{3,4}', s)) # <_sre.SRE_Match object; span=(0, 4), match='1235'> print(re.search(r'\d{3,5}', s)) # <_sre.SRE_Match object; span=(0, 5), match='12356'> print(re.search(r'\d{3,6}', s)) # <_sre.SRE_Match object; span=(0, 5), match='12356'> # 非貪婪模式:總是嘗試匹配儘可能少的字元,在"*","?","+","{m,n}",{m,}後面加上?,可以關閉貪婪模式 # 關閉貪婪模式之後,儘可能獲取更少的,如下,只獲取到最前面的3個數值(規則時至少3個,非貪婪就是匹配最前面符合規則的3個數組) print(re.search(r'\d{2,4}?', s)) # <_sre.SRE_Match object; span=(0, 2), match='12'> print(re.search(r'\d{3,4}?', s)) # <_sre.SRE_Match object; span=(0, 3), match='123'>
二、正則表示式語法
1、表示單字元
單字元:即表示一個單獨的字元,比如匹配數字用\d ,匹配非數字使用\D,具體規則如下:
字元 |
功能 |
|
. |
匹配任意1個字元(\n除外) |
|
[7a ] |
匹配[ ]中列舉的字元,這裡就是匹配7或者a這兩個字元其中的一個 |
|
\d |
匹配數字,即0-9 |
|
\D |
匹配非數字,即不是數字 |
|
\s |
匹配空白,即 空格,tab鍵 |
|
\S |
匹配非空白 |
|
\w |
匹配單詞字元,即a-z、A-Z、0-9、_ |
|
\W |
匹配非單詞字元 |
例項如下:
# {m,n}表示n>m,匹配的位數 # .:匹配任意1個字元(\n除外) print(re.search(r'.', s)) # <_sre.SRE_Match object; span=(0, 1), match='1'> #[7a]匹配[ ]中列舉的字元,這裡就是匹配7或者a這兩個字元其中的一個 print(re.search(r'[3a]', s)) # <_sre.SRE_Match object; span=(2, 3), match='3'> print(re.search(r'[3p]', s)) # <_sre.SRE_Match object; span=(2, 3), match='3'> print(re.search(r'[p3]', s)) # <_sre.SRE_Match object; span=(2, 3), match='3'> print(re.search(r'[p4]', s)) # <_sre.SRE_Match object; span=(5, 6), match='p'>
import re s = '12356python123456python#' # \d匹配數字,即0-9 print(re.search(r'\d', s)) # <_sre.SRE_Match object; span=(0, 1), match='1'> print(re.search(r'\d{3,}', s)) # <_sre.SRE_Match object; span=(0, 5), match='12356'> # \D匹配非數字,即不是數字 print(re.search(r'\D', s)) # <_sre.SRE_Match object; span=(5, 6), match='p'> print(re.search(r'\D{3,}', s)) # <_sre.SRE_Match object; span=(5, 11), match='python'> # \w匹配單詞字元,即a-z、A-Z、0-9、 print(re.search(r'\w', s)) # <_sre.SRE_Match object; span=(0, 1), match='1'> # \W匹配非單詞字元,即a-z、A-Z、0-9、 print(re.search(r'\W', s)) # <_sre.SRE_Match object; span=(23, 24), match='#'>
2、表示數量
如果要匹配某個字元多次,就可以在字元後面加上數量進行表示,具體規則如下:
字元 |
功能 |
* |
匹配前一個字元出現0次或者無限次,即可有可無 |
+ |
匹配前一個字元出現1次或者無限次,即至少有1次 |
? |
匹配前一個字元出現1次或者0次,即要麼有1次,要麼沒有 |
{m} |
匹配前一個字元出現m次 |
{m,} |
匹配前一個字元至少出現m次 |
{m,n} |
匹配前一個字元出現從m到n次 |
import re s = '12356python123456python#' # *匹配前一個字元出現0次或者無限次,即可有可無 print(re.findall(r'1*',s)) # ['1', '', '', '', '', '', '', '', '', '', '', '1', '', '', '', '', '', '', '', '', '', '', '', '', ''] print(re.findall(r'T*',s)) # ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', ''] # +匹配前一個字元出現1次或者無限次,即至少有1次 print(re.findall(r'1+', s)) # ['1', '1'] print(re.findall(r'T+', s)) # [] # ?匹配前一個字元出現1次或者0次,即要麼有1次,要麼沒有 print(re.findall(r'1?',s)) # ['1', '', '', '', '', '', '', '', '', '', '', '1', '', '', '', '', '', '', '', '', '', '', '', '', ''] print(re.findall(r'T+?', s)) # [] # {m}匹配前一個字元出現m次 print(re.findall(r'1{1}', s)) # ['1', '1'] # {m,}匹配前一個字元至少出現m次 print(re.findall(r'1{2,}', s)) # [] # {m,n}匹配前一個字元出現從m到n次 print(re.findall(r'4{1,4}', s)) # ['1', '1']