正則表達式爲高級的文本模式匹配,抽取,與/或文本形式的搜索和替換功能提供了基礎,簡單的來講,正則表達式是由一些字符和特殊符號組成的字符串。Python經過標準庫中的re模塊來支持正則表達式。python
首先介紹一下最多見的特殊符號和字符,即所謂的元字符。正則表達式
表示法 | 描述 | 正則表達式用法示例 |
---|---|---|
literal | 匹配文本字符串的字面值literal | re.findall("chen","sadchen21") |
. | 匹配任意字符(除了\n以外) | re.findall("c..n","sadchen21") |
^ | 從字符串開始部分開始匹配 | re.findall("^sad","sadchen21") |
$ | 匹配字符串的終止部分 | re.findall("21$","sadddchen21") |
* | 匹配0次或屢次前面出現的正則表達式 | re.findall("sad*","saddddchen21") |
+ | 匹配1次或屢次前面出現的正則表達式 | re.findall("sad+","sadddchen21") |
? | 匹配0次或者1次前面出現的正則表達式 | re.findall("sad?","sadddchen21") |
{N} | 匹配N次前面出現的正則表達式 | re.findall("sad{3}","sadddchen21") |
{M,N} | 匹配M~N次前面出現的正則表達式 | re.findall("sad{1,3}","sadddcen21") |
[] | 匹配來自字符集的任一單一字符 | re.findall("[a-z]","sadddcen21") |
[^..] | 不匹配此字符集中出現的任一字符,包括某一範圍的字符 | re.findall("[^a-z]","sadddcen21") |
(...) | 匹配封閉的正則表達式,而後另存爲子組 | re.findall("[(a-z)]","sadddcen21") |
\d | 匹配任何的十進制數,與[0-9]一致(/D與/d相反,不匹配任何非數值型的數字) | re.findall("\d","sa2dcen21") |
\w | 匹配任何字母數字字符,與[A-Z],[a-z],[0-9]相同,(\W與之相反) | re.findall("\w","sa2dcen21") |
\s | 匹配任何空格字符,與\n\r\t等相同,(與\S相反) | re.findall("\s","sa2dce\nn 21") |
\b | 匹配任何單詞邊界,匹配特殊字符(\B與之相反) | re.findall(r"I\b","I am Czp") |
在上面/b的例子中,爲何要加r?
r的做用就是讓後面的字符串不作任何的轉義,若是不加r能不能起到相同的做用呢?函數
re.findall("I\\b","I am Czp") 經過轉義符\來實現
re.findall("ka|b","sdkakb11") 匹配ka或b re.findall("ka|b","sdka11")
re.findall("s..a","sdka11") 匹配在s和a之間任意的兩個字符 re.findall("..","sdka11") 匹配任意兩個字符 re.findall(".a","sdka112") 匹配a前的任意一個字符
要顯式匹配一個句點符號自己,必須使用反斜槓轉義句點符號的功能,例如「\.」3d
re.findall("^sa","sdka112") 匹配以s開頭的字符或字符串 re.findall("12$","sdka112") 匹配以12結尾的字符或字符串
匹配邊界字符「\b」
\b用於匹配一個單詞的邊界,這意味着若是一個模式必須位於單詞的起始部分,就無論該單詞前面(單詞位於字符串中間)是否有任何字符(單詞位於首行),而\B將匹配出如今一個單詞中間的模式,即不是單詞邊界code
re.findall("er","never") 匹配任意包含the的字符串 re.findall(r"er\b","never") 匹配任意以er爲起始位置的字符串 re.findall(r"er\B","evern") 匹配包含er但不以er爲起始的字符串
建立字符集「[]」
「.」能夠用於匹配任意符號,但某些時候須要匹配某些特定字符,這就須要[],用來匹配一對方括號中包含的任何字符。如b[ner]t匹配的字符串就是bnt,bet,brt,方括號表示邏輯或的功能,對於單個字符,若是想要:要麼匹配a,要麼匹配b,就能夠用[ab]表示,字符集只適用於單字符的狀況,若是要匹配多個字符,就須要使用擇一方法「|」
最經常使用的特殊符號「」「+」「?」
""、"?"、"+"均可以用來匹配一個、多個或者沒有出現的字符串模式,"*」用來匹配其左邊的正則表達式出現零次或屢次,「+」號將匹配一次或屢次出現的狀況,「?」將匹配零次或一次出現的正則表達式,而{N}或{M,N}這將最終精確的匹配前面的正則表達式N次或必定範圍的次數。
當模式匹配使用分組操做符的時候,正則表達式的引擎將試圖匹配出儘量多的字符,這叫作貪婪匹配對象
re.findall("sad*","saddddsds") 匹配d,d能夠出現0次,或屢次 re.findall("sad+","saddddsds") 匹配d,d不能夠出現0次,匹配1次或屢次 re.findall("sad?","saddddsds") 匹配d,d能夠出現0次,匹配0次或1次 re.findall("\d{2}","sad123dsds") 匹配兩個連續的數字字符
若是想要提取任意已經成功匹配的特定字符串或子字符串,就須要用「()」來包裹正則表達式
當使用正則表達式的時候,一對圓括號能夠實現如下任意一個功能字符串
示例:當有兩個不一樣的正則表達式並且想用它們來比較同一個字符串的時候,就須要用到「()」,還有對正則表達式進行分組能夠重複使用操做符,使匹配到的子字符串保存起來以供後續使用。
擴展表示法,以問號開始(?..),很重要的一個(?P
常見的正則表達式屬性
compile() | 使用可選的標記來編譯正則表達式的模式,返回一個對象
match() | 匹配字符串,若是成功,就返回匹配對象,若是失敗,就返回None
search() | 匹配第一次出現的正則表達式,成功,返回匹配對象,失敗,就返回None
findall() | 查找字符串中全部出現的正則表達式模式,並返回一個匹配列表
finditer() | 與findall相同,但返回的不是一個列表,而是一個迭代器
spilt() | 將字符串分割爲列表,返回成功匹配的列表
sub() | 替換全部正則表達式的模式在字符串中出現的位置
purge() | 清楚隱式編譯的正則表達式模式
group() | 返回整個匹配對象,或者編號爲num的特定子組
函數篇就寫到這裏,接下來會寫面向對象部分的內容,若是有遺漏的,歡迎你們和我交流,我會第一時間補上遺漏的知識點。io