Python編程基礎(中國mooc)6---正則表達式

正則表達式的基礎語法:

通過正則表達式可以定義一些匹配規則,只要滿足匹配規則即認爲匹配成功,從而實現模糊匹配。
正則表達式中既可以包含普通字符,也可以包含由特殊字符指定的匹配模式。
在實際應用正則表達式進行匹配時,正則表達式中的普通字符需要做精確匹配,而特殊字符指定的匹配模式則對應了用於模糊匹配的規則。

由於Python的字符串中使用“\”作爲轉義符,如果要在字符串中使
用字符“\”,則需要寫作“\\”。
因此,當進行“\bfoo\b”的匹配時,實際編寫代碼時要寫作'\\bfoo\\b',但這
樣會造成代碼編寫時容易出錯且代碼可讀性較差。
因此,我們通常在用於表示正則表達式的字符串前加上一個字符r,使得後面的字符串
忽略轉義符。例如,對於字符串'\\bfoo\\b',我們可以寫作r'\bfoo\b'。

 

 

re模塊使用-compile和match:


compile:
compile 函數用於將一個字符串形式的正則表達式編譯成一個正則表達式對象,
供 match、search以及其他一些函數使用。compile函數的語法格式爲:re.compile(pattern, flags=0)

其中,pattern是一個字符串形式的正則表達式;flags指定了匹配選項,可以使用按位或(|)運算符將多個選項連接起來;flags的默認值爲0,
表示沒有任何匹配選項。

 

match:

re模塊中的match函數用於對字符串開頭的若干字符進行正則表達式的匹配。
re.match函數的語法格式爲:re.match(pattern, string, flags=0)
其中,pattern是要匹配的正則表達式;string要作正則表達式匹配的字符串;flags參數的含義與compile函數中的flags參數相同。如果匹配成功,則返回一個Match對象;如果匹配失敗,則返回None。
 

import re
result1=re.match(r'python', 'Python是一門流行的編程語言', re.I)
result2=re.match(r'python', '我喜歡學習Python', re.I)
print('result1:',result1)
print('result2:',result2)

out:
result1: <re.Match object; span=(0, 6), match='Python'>
result2: None
 

match函數返回的是一個Match對象,其中span是匹配的字符序列在字符串中的位置信息,而match中保存了匹配到的字符序列信息。

即便對flags參數指定了匹配選項re.MULTILINE或re.M,re.match函數也只會對字符串開頭的若干字符作匹配,而不對後面行的開頭字符作匹配。

 

 

除了直接調用re模塊中的match函數外,也可以使用compile函數生成的正則表達式對象中的match方法實現同樣的功能,其語法格式爲:Pattern.match(string[,pos[,endpos]])

其中,Pattern是compile函數返回的正則表達式對象;string是要做正則表達式匹配的字符串;可選參數pos指定了從string的哪個位置開始進行匹配,默認爲0;可選參數endpos指定了string的結束位置,match函數將對string中pos至endpos-1範圍的子串進行正則表達式匹配。

import re
pattern=re.compile(r'python', re.I) #生成正則表達式對象
result1=pattern.match('Python是一門流行的編程語言')
result2=pattern.match('我喜歡學習Python!',5)
print('result1:',result1)
print('result2:',result2)

out:
result1: <re.Match object; span=(0, 6), match='Python'>
result2: <re.Match object; span=(5, 11), match='Python'>

使用compile函數的優點在於:當一個正則表達式在程序中被多次使用時,通過compile函數生成的正則表達式對象可重複使用、從而提高效率。

 

 

re模塊使用-search:

re模塊中的search函數對整個字符串進行掃描並返回第一個匹配的結果。
re.search函數的語法格式爲:re.search(pattern, string, flags=0)
re.search函數各參數的含義與re.match函數完全相同。如果匹配成功,
則返回一個Match對象;否則,返回None。

import re
a=re.search("\\d{3}",'h6468kh325guiih')
print(a)

<re.Match object; span=(1, 4), match='646'>

不同於re.match函數(只匹配字符串開頭的若干字符),re.search函數可以對整個字符串從左向右掃描找到第一個匹配的字符序列。

 

 

使用前面介紹的match函數和search函數,匹配成功時都會返回一個Match對象,
匹配失敗時則返回None。將Match對象作爲判斷條件時,其永遠返回True;而None則返回
False。因此,通過“if result1:”和“if result2:”即可判斷前面的匹
配是否成功。

if re.search('[0-5]{3}','6iop5426'):
    print(re.search('[0-5]{3}','6iop5426'))

out:
<re.Match object; span=(4, 7), match='542'>

if re.search('\\[0-5]{4}','6iop7899'):
    print(re.search('\\[0-5]{4}','6iop5426'))

 


 

 

re模塊使用-findall和finditer:

re模塊中的findall函數用於在字符串中找到所有與正則表達式匹配的子串。re.findall函數的語法格式爲:re.findall(pattern,string,flags=0)
各參數含義與re.match和re.search函數完全相同。如果匹配成功,則將匹配的數據以列表的形式返回;如果匹配失敗,則返回空列表。

import re
a=re.findall("\\d{3}",'h6468kh325guiih')
print(a)

out:
['646', '325']

 

與re.match和re.search函數不同,re.findall函數可以一次完成字符串中所有滿足正則表達式規則的子串的匹配。

 

 

 

re模塊使用-split、sub、subn:

split:
re模塊中的split函數用於將字符串按與正則表達式匹配的子串分割。
re.split函數的語法格式如下:re.split(pattern, string, maxsplit=0, flags=0)

其中,pattern是正則表達式;string是要分割的字符串;maxsplit是最大分割次數,默認爲0表示不限制分割次數;flags與re.match等函數中
的flags參數含義相同。


import re
str='sno:1810101,name:李曉明,age:19,major:計算機'

re.findall(r'\W+', str)
Out[95]: [':', ',', ':', ',', ':', ',', ':']

rlt=re.split(r'\W+', str)

print(rlt)
out:
['sno', '1810101', 'name', '李曉明', 'age', '19', 'major', '計算機']

 

 

sub:

re模塊的sub函數用於替換字符串中與正則表達式匹配的子串。re.sub
函數的語法格式爲:re.sub(pattern, repl, string, count=0, flags=0)

其中,pattern是正則表達式;repl是要將匹配子串替換成的字符串;string是待做替換操作的字符串;count是最大替換次數,默認爲0表示不限制替換次數(即將所有符合正則表達式的子串都替換成repl);flags與re.match等函數中的flags參數含義相同。

import re
str='sno:1810101,name:李曉明,age:19,major:計算機'
re.sub('\\W+','+',str)

Out[14]: 'sno+1810101+name+李曉明+age+19+major+計算機'

 

 

subn:

re模塊中的subn函數與re.sub函數功能完全相同,只是re.subn函數會
以一個元組的形式同時返回替換匹配子串後得到的新字符串和替換的
次數。re.subn函數的語法格式爲:re.subn(pattern, repl, string, count=0, flags=0)
各參數含義與re.sub函數相同。

import re
str='sno:1810101,name:李曉明,age:19,major:計算機'
re.subn('\\W+','+',str)
Out[18]: ('sno+1810101+name+李曉明+age+19+major+計算機', 7)

 

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