正则注意重点
20220110
a = '你好/啊'
b = re.sub(r'/','*',a)
反斜杠替換
20210610
https://mp.weixin.qq.com/s/amaYB0Z_r8wbbjHHk3vshg
最強整理!常用正則表達式速查手冊
20210323
"非貪心的"模式匹配搜索到的、盡可能短的字符串,而默認的"貪心的"模式匹配搜索到的、盡可能長的字符串。例如,在字符串"oooo"中,"o+?“只匹配單個"o”,而"o+“匹配所有"o”。
正則日常電腦搜索
.{0,5}人工智能.{0,5}筆記
df[‘體重’] = df[‘體重’].apply(lambda x: re.sub(r’[^\d.]’,’’, x))
sub 和replace 功能類似
匹配小數點 不需要加斜杠?
重點:分清哪些是固定一定要的,哪些是不需要捕獲的
并且分類匹配 分類從最高層開始想
把經常連在一起的分成一類 比如 那個小區 幢 單元 號
省市區縣等 分成兩類
import re
a=‘www.baidu.com/num’
b=re.findall(‘www.baidu.com/.*’,a)
b
轉義是反斜杠!!!
在r 的正則式中\本來是特殊意義的,再加一個反斜杠就是把
其變成本身的反斜杠意義了
轉義是反斜杠!!! \ “/“”這個是斜杠
findall 匹配什么就輸出什么而不是序號
匹配到的結果列表=re.findall(r’正則字符串’,要匹配的字符串,re.I|re.S)
re.I,表示忽略大小寫
re.S,表示忽略回行,所有字符包括回行字符
s1=re.findall(r’(?=String|Float|Integer)(?P\w+)\s+(?P.?)\s?=\s*?(?P.?)\s?;’,str,re.I|re.S)
分組: type name value 可以自由命名
正則表達式在整個表達式是連續的!!!!!!!!!!
轉義字符 \Q…\E
使用 \Q 開始,\E 結束,可使中間的標點符號失去特殊意義,將中間的字符作為普通字符。
使用 \U 開始,\E 結束,除了具有 \Q…\E 相同的功能外,還將中間的小寫字母轉換成大寫。在大小寫敏感模式下,只能與大寫文本匹配。
使用 \L 開始,\E 結束,除了具有 \Q…\E 相同的功能外,還將中間的大寫字母轉換成小寫。在大小寫敏感模式下,只能與小寫文本匹配。
說明
\Q…\E 適合用于:表達式中需要比較長的普通文本,而其中包含了特殊符號。
舉例
表達式
說明
\Q(a+b)*3\E
可匹配文本 “(a+b)*3”。
(a+b)*3
如果不使用 \Q…\E 進行轉義,則對每個特殊符號進行轉義。
自定義字符集合 [ ]
用中括號 [ ] 包含多個字符,可以匹配所包含的字符中的任意一個。同樣,每次只能匹配其中一個。
用中括號 [^ ] 包含多個字符,構成否定格式,可以匹配所包含的字符之外的任意一個字符。
說明
正則表達式中的特殊符號,如果被包含于中括號中,則失去特殊意義,但 \ [ ] : ^ - 除外。
標準字符集合,除小數點(.)外,如果被包含于中括號中,自定義字符集合將包含該集合。
比如:[\d.-+],將可以匹配數字,小數點和 + - 符號。(小數點和 + 號失去特殊意義)
用減號相連的 2 個普通字符,自定義字符集合將包含該范圍。
比如:[\dA-Fa-f],將可以匹配 0 - 9, A - F, a - f。
自定義字符集合可以包含 POSIX 字符集合。
不管正則表達式匹配模式是否是 IGNORECASE,字符集合在匹配時,都是要區分大小寫的。更多詳情,參見正則表達式匹配模式。
匹配次數限定符
使被修飾的表達式可多次重復匹配的修飾符。
說明
可使被修飾的表達式重復固定次數,也可以限定一定的重復匹配的次數范圍。
在限定符之后的表達式能夠匹配成功的情況下,不定次數的限定符總是盡可能的多匹配。如果之后的表達式匹配失敗,限定符可適當“讓出”能夠匹配的字符,以使整個表達式匹配成功。這種模式就叫“貪婪模式”。
限定符
說明
{n}
表達式固定重復n次,比如:"\w{2}" 相當于 “\w\w”
{m, n}
表達式盡可能重復n次,至少重復m次:"ba{1,3}"可以匹配 “ba"或"baa"或"baaa”
{m, }
表達式盡可能的多匹配,至少重復m次:"\w\d{2,}"可以匹配 “a12”,“x456”…
?
表達式盡可能匹配1次,也可以不匹配,相當于 {0, 1}
表達式盡可能的多匹配,至少匹配1次,相當于 {1, }
表達式盡可能的多匹配,最少可以不匹配,相當于 {0, }
“勉強模式”限定符:
在限定符之后添加問號(?),則使限定符成為“勉強模式”。勉強模式的限定符,總是盡可能少的匹配。如果之后的表達式匹配失敗,勉強模式也可以盡可能少的再匹配一些,以使整個表達式匹配成功。
限定符
說明
{m, n}?
表達式盡量只匹配m次,最多重復n次。
{m, }?
表達式盡量只匹配m次,最多可以匹配任意次。
??
表達式盡量不匹配,最多匹配1次,相當于 {0, 1}?
+?
表達式盡量只匹配1次,最多可匹配任意次,相當于 {1, }?
*?
表達式盡量不匹配,最多可匹配任意次,相當于 {0, }?
“占有模式”限定符:
在限定符之后添加加號(+),則使限定符成為“占有模式”。占有模式的限定符,總是盡可能多的匹配。與“貪婪模式”不同的是,即使之后的表達式匹配失敗,“占有模式”也不會“讓出”自己能夠匹配的字符。
限定符
說明
{m, n}+
表達式盡可能重復n次,至少重復m次。
{m, }+
表達式盡可能的多匹配,至少重復m次。
?+
表達式盡可能匹配1次,也可以不匹配,相當于 {0, 1}+
++
表達式盡可能的多匹配,至少匹配1次,相當于 {1, }+
*+
表達式盡可能的多匹配,最少可以不匹配,相當于 {0, }+
字符邊界
本身不匹配任何字符,只對字符邊界和字符間縫隙附加條件的表達式。
說明
有些正則表達式中的符號,可以對文本中當前所在位置作限制條件:
邊界條件
說明
^
當前位置必須是文本開始位置
$
當前位置必須是文本結束位置
\b
當前位置的左右兩側,只能有一側是字母數字或下劃線
如果正則表達式的匹配模式為 MULTILINE 模式,^ 可匹配一行文本的行首,$ 可匹配一行文本的行末。更多詳情,參見正則表達式匹配模式。
當 \b 被包含于字符集合中時,\b 代表退格符(ASCII碼 = 8)。
分組 ( )
用括號 ( ) 將其他表達式包含,可以使被包含的表達式組成一個整體,在被修飾匹配次數時,可作為整體被修飾。
另外,用括號包含的表達式,所匹配到的內容將單獨作記錄,匹配過程中或結束后可以被獲取。
說明
每一對括號會分配一個編號,使用 () 的捕獲根據左括號的順序從 1 開始自動編號。捕獲元素編號為零的第一個捕獲是由整個正則表達式模式匹配的文本。
命名分組 (?xxx)
與普通分組一樣的功能,并且將匹配的子字符串捕獲到一個組名稱或編號名稱中。
在獲得匹配結果時,可通過分組名進行獲取。
說明
命名捕獲根據左括號的從左到右的順序按順序編號(與非命名捕獲類似),但在對所有非命名捕獲進行計數之后才開始對命名捕獲進行編號。
DEELX 允許多個命名分組的名字相同,這時它們捕獲到的內容會放在同一個分組編號下。在邏輯上,它們是同一個分組。
如果兩個命名相同分組之間有包含關系,那么被包含的那個分組將不進行捕獲。
反向引用 \nnn
對指定分組已捕獲的字符串進行引用,要求文本中當前位置開始的字符串,必須和指定分組捕獲到的字符串一致。
說明
DEELX 支持的反向引用格式:
反向引用
說明
\nnn
對指定編號的分組進行反向引用
\g
對指定名字的命名分組進行反向引用
\k
\k’name’
另外,如果被引用的捕獲組(括號對)未進行捕獲時,則該反向引用將匹配失敗。
DEELX 最多將 3 位數字識別為反向引用,如果想在表達式中表示 \1 外加一個字符 2 ,那么應該寫成 \0012。在 DEELX 中,不管是否有第 12 對括號,寫成 \12 都表示對第 12 對括號的引用。
DEELX 不將 \nnn 格式識別為 8 進制數,參見簡單的轉義字符。
注釋 (?#xxx)
格式 (?# xxx ) 可用來表示一段注釋。
說明
注釋可以位于表達式中任意地方,但不可以出現在轉義字符(\)與被轉移字符中間。比如:(?# xxx )w 是不可以的,這樣寫的效果實際上是第一個括號被轉義成普通字符了。
在 (?# 之后,遇到第一個反括號將表示注釋結束。因此,想把注釋寫成 (?# x()xx ) 或者 (?# x)xx ) 都是不可以的。注釋中的反斜杠(\),不代表轉義字符。
非捕獲組 (?:xxx)
使用 (?: ) 包含其他表達式,可使被包含的表達式組成一個整體,在被修飾匹配次數時,可作為整體被修飾。
說明
與普通分組不同的是,非捕獲組不記錄所匹配的內容,比普通分組更節約內存資源。
通過格式 (?ismg-ismg:xxx) 可對匹配模式進行修改,修改后的模式只對當前非捕獲組內部起作用。
預搜索(令寬度斷言)
判斷當前位置的前后字符,是否符合指定的條件,但不匹配前后的字符。
說明
預搜索有向前和向后兩種:
表達式
方向
說明
(?=xxx)
正向預搜索(向右)
正向預搜索,判斷當前位置右側是否能匹配指定表達式
(?!xxx)
正向預搜索否定,判斷當前位置右側是否不能夠匹配指定表達式
(?<=xxx)
反向預搜索(向左)
反向預搜索,判斷當前位置左側是否能夠匹配指定表達式
(?<!xxx)
反向預搜索否定,判斷當前位置左側是否不能夠匹配指定表達式
在 DEELX 中,不管整個表達式是“普通模式”還是“從右向左”模式,正向預搜索內部的表達式,始終采用“普通模式(從左向右)”模式,反向預搜索內部的表達式,始終采用“從右向左”模式。
獨立表達式 (?>pattern)
獨立表達式所匹配的內容,與將它單獨匹配時匹配的內容一致。不管之后的表達式是否匹配成功,獨立表達式內部都不進行回退,都不會再次嘗試匹配。
說明
相比之下,如果 pattern 不是位于獨立表達式中,當后邊的表達式匹配失敗時,pattern 所包含的不定次數的表達式(?, +, {n,m}, ……)會嘗試改變匹配次數,選擇表達式(比如:a|b)也會嘗試匹配另一個選項,再次進行匹配,以盡量使整個表達式能夠匹配成功。
條件表達式
根據某個條件是否成立,來選擇匹配 2 個可選表達式中的其中一個。
說明
可以用于條件表達式的條件有兩種類型:
指定分組(group)是否進行了捕獲。
文本中當前位置是否可以與指定表達式匹配。
條件表達式的格式及說明:
表達式
條件特點
條件說明
(?(1)yes|no)
條件為數字
分組1如果有捕獲,則進行 yes 部分匹配,否則 no 部分
(?(?=a)aa|bbb)
條件為預搜索
如果當前位置右側是 a,則進行匹配 aa,否則匹配 bbb
(?(xxx)aa|bbb)
不與分組命名吻合
如果不與任何分組命名吻合,則視為 (?=xxx) 相同
(?(name)yes|no)
與分組命名吻合
如果與某分組命名吻合,則視為判斷該分組是否進行捕獲
另外:
如果表達式為 RIGHTTOLEFT 模式,那么 (?(xxx)aa|bbb) 與 (?(?<=xxx)aa|bbb) 相同。
如果條件表達式只有一個選擇項,那么這個選項是在條件成立時進行匹配。
如果條件表達式中,使用“|”進行分隔的選項多于2個,則只有第一個“|”被視為條件表達式選項分隔符。比如: (?(?=xxx)yes|no1|no2),條件成立時,匹配 yes 部分,否則匹配 “no1|no2”。
遞歸表達式 (?R)
對另一部分子表達式的引用,而不是對其匹配結果的引用。當被引用的表達式包含自身,則形成遞歸引用。
說明
相對于 “反向引用” 來說,反向引用是在匹配過程中,對匹配到的字符串內容進行引用,而 “遞歸匹配” 是對表達式進行引用。舉例說明:
表達式
等效的表達式1
等效的表達式2
可以匹配
(\w)(?1)
(\w)(\w)
ab
(?1)(\w(?2))(\d)
(?1)(\w(\d))(\d)
(\w(\d))(\w(\d))(\d)
a1b23
如果被引用的表達式又包含自身,則形成了遞歸引用。舉例說明:
表達式
等效1
等效2
可以匹配
(\w(?1)?)
(\w(\w(?1)?)?)
(\w+)
ghjk5……
(([^()]|(?R)))
(([()]|(([()]|(?R))))*)
(a * (c + 2))
DEELX 支持的遞歸表達式格式有:
格式
說明
(?R)
對整個表達式的遞歸引用。
(?R1),(?R2)
對指定分組的遞歸引用。
(?1),(?2)
(?R)
對指定命名分組的遞歸引用。
(?R’named’)
總結
- 上一篇: 面向过程(或者叫结构化)分析方法与面向对
- 下一篇: 正则体系1