一、基本符號
分組:()
分組命名:(?prexp) 將 rexp 匹配的字串作為分組 name
條件:(?(name)y|n) 當存在分組 name 時,執行 y 匹配,否則執行 n, "|n" 可以省略
二、關於分組命名
先看輸入
casestr = r'''
1-test fire
2:joker_there
75-just fine
66:all_right
'''
有兩種格式:「數字 -」 , 「數字:」; 「數字 -」 匹配帶空格的字串, 「數字:」匹配不帶空格的字串
我們以 (?p\b\d+\-.*) 來匹配 「數字 -」 這樣的模式,並將組名命名為 ix1,得到的輸出為
['1-', '75-']
表示分別將 '1-' 和 '75-' 命名為 ix1 的組
這裡看不出來分組命名的作用,我們往後面走
三、關於條件
現在,我們有了 ix1 分組,我們用他進行條件判斷,正規表示式為
(?p\b\d+\-)(?(ix1)([^\n]+))
後面這段 (?(ix1)([^\n]+)) 表示當匹配 ix1 成功後,從 ix1 後面繼續匹配得到的結果,於是得到以下結果
[('1-', 'test fire'), ('75-', 'just fine')]
四、應用
那麼現在需要想辦法達到我們的目的了:「數字 -」 匹配帶空格的字串, 「數字:」匹配不帶空格的字串
這裡引入另外乙個好用的擴充套件表示式,非捕獲
(?:rexp)
表示匹配 rexp 表示式的字串,但是不返回匹配內容
於是,我們最終的解決思路出來了
mstr = r'''
(?:(?p\b\d+\-)
(?(ix1)([^\n]+)))|
(?:(?p\b\d+\:)
(?(ix2)(\w+))
)'''
返回結果如下
如果沒有非捕獲,返回的結果如下,會將該組內容返回
[('1-test fire', '1-', 'test fire', '', '', ''), ('', '', '', '2:joker_there', '2:', 'joker_there'), ('75-just fine', '75-', 'just fine', '', '', ''), ('', '', '', '66:all_right', '66:', 'all_right')]
由於非捕獲不能和分組命名/條件巢狀,所以,這已經是博主能想到的最好的方式了
五、附原始碼
#-*-coding:utf8;-*-
import re
casestr = r'''
1-test fire
2:joker_there
75-just fine
66:all_right
'''print casestr
mstr = r'''
(?: (?p\b\d+\-)
(?(ix1)([^\n]+)))|
(?: (?p\b\d+\:)
(?(ix2)(\w+))
)'''
res = re.findall(mstr, casestr, re.verbose)
print res
# 2018/06/26 # 正規表示式 分組
正規表示式對於單個字元的重複,非常方便。比如 d 表示1個或多個數字,表示重複0次或多次 重複1次或多次 重複0次或1次 重複n次 重複n次或多次 重複n次到m次 指定的字元後加特定的限定符,即可實現單字元的重複,那麼,對於一組字串的重複,正規表示式該如何操作?用小括號來指定子表示式 或稱分組 對指...
分組 正規表示式
在正規表示式中,可以用小括號將一些規則括起來當作分組,分組可以作為乙個元字元來看待。d d這是乙個簡單的且不完善的匹配 ip 位址的正規表示式,因為它除了能匹配正確的 ip 位址外,還能匹配如 322.197.578.888 這種不存在的 ip 位址。當然,用這個表示式簡單匹配成功後可以在利用 ph...
正規表示式 分組
group 分組 分了幾組就看分了幾個小括號 分了幾對小括號 當有巢狀的小括號時,怎麼區分那個是第一組那個是第二組呢?只需要數小括號邊的左小括號,看到第乙個左小括號就是第一組,第二個左小括號就是第二組 group 分組 public class test8 3到5位的數字 a z 2位的字母 a z...