這下女友總算滿意了!

文 | 極光
來源:Python 技術(shù)「ID: pythonall」

上次跟女友介紹了正則表達式的基本語法,以及在 Python 中如何使用。結(jié)果她還不滿意,說傳說中的正則表達式就這么簡單?當然不是,今天就來跟大家一起介紹下正則表達式更多的使用技巧。
小括號,大作用
一般用于獲取
()中的正則內(nèi)容進行下一步操作使用,如果想要關(guān)閉這種獲取能力,可以在左括號(后面加上?:就可以了。另一個作用就是讓括號內(nèi)正則表達式進行組合,方便使用之前介紹的
?* +等,還有或操作符|。
當獲取了小括號里的內(nèi)容后,我們也可以反向引用 () 里的內(nèi)容,每一個小括號里的內(nèi)容,只要沒有使用 ?: ,就會被分配一個組號,從左到右從1開始遞增。
在使用中,可以使用 \i 引用前面 () 里獲取的內(nèi)容。
除了上面使用索引的方式反向引用外,還可以使用組名的方式引用。
也就是通過左括號 ( 后面跟一個字串 ?P<組名> 的方式,來為這個組起一個別名,后面就可以通過 (?P=組名) 來引用這個組獲取的內(nèi)容了。例如想要匹配重復數(shù)字,可以使用 (?P<key>\d+)\s+(?P=key)。
斷言
在實際使用中,我們需要對正則表達式使用斷言,來對文本進行部分約束,但斷言不會匹配任何文本。
| 斷言 | 說明 |
|---|---|
\b | 匹配單詞的邊界 |
\B | 匹配非單詞邊界,會受到ASCII標記影響 |
\A/^ | 從開始位置匹配, 如有MULTILINE標志,則^會在每個換行符后匹配 |
\Z/$ | 在結(jié)束位置匹配,如有MULTILINE標志,則$在每個換行符前匹配 |
另外還有些特殊的,如正前瞻、負前瞻、正回顧、負回顧:
正前瞻(?=e):如 表達式1(?=表達式2) 表達式3,則表式后面的內(nèi)容需要匹配表達式2;負前瞻(?!e):如 表達式1(?!表達式2) 表達式3,則表式后面的內(nèi)容不能匹配表達式2;正回顧(?<=e):如 (?<=表達式2)表達式1 表達式3,則表式前面的內(nèi)容需要匹配表達式2;負回顧(?<!e):如 (?<!表達式2)表達式1 表達式3,則表式前面的內(nèi)容不能匹配表達式2。
例如我們想查找一個字串 python,而這個字串后面必須要跟著 data 字串,那我們就可以使用 (python)\s+(?=data)。
這樣即使字串中有 python,但我們限定了只匹配這種情況,可以大大提高了準確率。
條件表達
相信大家在平時開發(fā)過程中會經(jīng)常用到三目運算符,比如 data == 1 ? 'Y' : 'N',在正則里也有類似的運算操作。
表達式:(?(判斷表達式) 為真時執(zhí)行表達式| 為假時執(zhí)行表達式),當判斷表達式匹配到內(nèi)容的時候,則這里就會匹配為真時的表達式,否則就會匹配為假時的表達式。
例如:(?(\d+) [\s\d,]| [\s,])
正則的四大功能
在我們平時用正則表達式處理字符串的時候,主要會使用到它的四大功能:
匹配:這個之前已經(jīng)詳細講過了,就是看這個字符串是否符合正則表達式的語法。
提?。哼@個功能就是用來通過正則表達式提取指定字符串中符合要求的文本,如果有符合表達式的內(nèi)容會返回一個或多個。
替換:這個功能可能用的會少一些,主要是用來將查找到的符合要求的文本,替換成我們指定的字符串。
拆分:這個功能用的更少了,其實就是用正則表達式對符合要求的文本字串進行分割。
正則的其他方法
上次已經(jīng)說了四個比較常用的方法,主要用來做匹配和提取,另外還有一些方法用來做替換和拆分,在這里我們也說一下:
sub(str, t, n):這個方法用來替換操作。即將每個匹配到的文本用
str進行替換,并返回替換后的字符串。當指定了n時,則最多替換 n 次。對于str可以是組名或者編號來引用捕獲到的內(nèi)容。subn(str, t, n):這個方法和
sub()方法基本相同,只是這個會返回一個二元組,其中除了包括結(jié)果字串,還有替換的數(shù)量。split(str, n):這個方法是用來拆分字串操作。即將匹配到的文本對字符串進行分割,并返回一個結(jié)果列表。如果正則存在分組,則把分組匹配文本放列表中,并且每兩個分割的中間作為列表的一部分。
正則匹配對象
一般正則表達式可以匹配的對象不同,需要調(diào)用不同的方法獲取。
| 方法 | 描述說明 |
|---|---|
| group() | 返回編號或組名匹配到的內(nèi)容。默認(0)是表示匹配整個表達式內(nèi)容,當然也可以指定多個,則會返回一個元組數(shù)據(jù)。 |
| groupdict() | 這個方法會返回一個字典,其中字典的 KEY 是命名的組名,VALUE 為組名對應獲取的內(nèi)容。 |
| groups() | 該方法會返回一個包含所有捕獲內(nèi)容的子分組的元組,如果指定了默認值,則這個值就會作為沒有獲取到的內(nèi)容的值。 |
| lastgroup() | 該方法用于獲取最后一個匹配到內(nèi)容的組名。 |
| lastindex() | 該方法會返回最后一個匹配到內(nèi)容的組編號。 |
| start() | 該方法用于指定匹配內(nèi)容子分組是從字串的哪個位置開始匹配的,如果沒有匹配則返回 -1。 |
| end() | 該方法用于返回當前匹配對象子分組是從哪個位置匹配結(jié)束的,如果沒有匹配則返回 -1. |
| span() | 該方法會返回一個二元組,內(nèi)容為 (start(), end()) 的返回值。 |
| pos() | 該方法用于搜索字符串的開頭起始位置。 |
| endpos() | 該方法用于搜索字符串的結(jié)束末尾位置。 |
常用正則表達式
英文和數(shù)字:
^[A-Za-z0-9]+$ 或 ^[A-Za-z0-9]{4,40}$中文、英文、數(shù)字包括下劃線:
^[\u4E00-\u9FA5A-Za-z0-9_]+$Email地址:
^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$手機號碼:
^(13[0-9]|14[5|7]|15[0|1|2|3|4|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$身份證號碼:
(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)空白行:
\n\s*\r日期格式:
^\d{4}-\d{1,2}-\d{1,2}復雜密碼:
^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])[a-zA-Z0-9]{8,10}$域名:
[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+\.?
總結(jié)
好了,今天就算是把 Python 正則表達式相關(guān)的都介紹完了,為了方便大家理解,講的比較基礎(chǔ),但真正用在項目中的時候,可以舉一反三靈活運用。OK,今天就聊這些,如果你喜歡記得點 在看。
PS:公號內(nèi)回復「Python」即可進入Python 新手學習交流群,一起 100 天計劃!
老規(guī)矩,兄弟們還記得么,右下角的 “在看” 點一下,如果感覺文章內(nèi)容不錯的話,記得分享朋友圈讓更多的人知道!


【代碼獲取方式】
