正規表示式的條件與分組的探索 基於python

2021-08-07 09:16:21 字數 1971 閱讀 5094

一、基本符號

分組:()

分組命名:(?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...