正規表示式 第三篇:分組匹配

悅光陰發表於2019-05-29

通常情況下,分組是用一對圓括號“()”括起來的正規表示式,匹配出的內容就表示一個分組。分組有一個例外的情況,分組也可以不使用圓括號,而是使用 | 元字元來表示分組,| 的兩側是兩個分組。

當使用圓括號表示分組時,從正規表示式的左邊開始看,看到的第一個左括號“(”表示第一個分組,第二個"("表示第二個分組,依次類推,需要注意的是,有一個隱含的全域性分組(就是0),就是整個正規表示式。預設情況下,正規表示式為每個分組自動分配一個組號,規則是:組號從1開始,從左向右,組號依次加1(base+1),例如,第一個分組的組號為1,第二個分組的組號為2,以此類推。

分組不僅有編號,還能為分組設定別名,在Python中,使用(?P<name>exp)為正規表示式exp設定別名。

匹配分組的元字元:

  • exp1 | exp2 :匹配exp1 或 exp2
  • (exp):把括號內的正則作為一個分組
  • (?P<name>exp):定義一個分組,併為分組起別名,分組的正則是exp
  • (?P=name):引用別名為name的分組
  • \num:使用分組的編號來引用分組,分組按照正規表示式中出現的順序編號1、2、3、...

一,分組引用

分組引用,是指在表示式中,重複使用正規表示式,使正規表示式的寫法更簡潔。

分組定義的三種形式:

  • (exp) :自動分配組號,通過分組號引用該分組;
  • (?P<name>exp) :命名分組,通過分組名引用該分組;
  • (?:exp) :該分組只在當前位置匹配文字,在該分組之後,無法引用該分組,該分組沒有分組名,也沒有分組號;

1,通過組號引用分組

在正規表示式前面定義一個分組(exp),在表示式的後面,能夠通過組號引用該分組的表示式,引用分組的語法是:\group_number;

例如:\b(\w+)\b\s+\1\b,在該正規表示式中,只存在一個分組(\w+),組號是1,在該分組的後面,使用\1來引用該分組,將\1替換為分組的子表示式,等價於:\b(\w+)\b\s+(\w+)\b

2,通過分組名引用分組

在正規表示式中,能夠對分組命名,命名的分組格式:(?P<name>exp),分組名是name,通過name來引用該分組的格式是:(?p=group_name),通過分組名和組號引用分組,其文字匹配的行為是一樣的。

例如:\b(?P<word>\w+)\b\s+(?P=word)\b,在該分組的後面中,使用(?P=word)引用該分組,把(?P=word)替換為分組的子表示式,等價於:\b(\w+)\b\s+(\w+)\b

3,無法引用的分組

(?:exp):使用這種語法定義的分組,不能引用,只能在當前的位置匹配文字,正規表示式不為該分組自動分配組號。

二,匹配分組的示例

下面使用Python的re模組來演示如何使用分組。

1,匹配任意分組

>>> out=re.match('[0-9]?\d$|100','08')
>>> out
<re.Match object; span=(0, 2), match='08'>

2,使用()定義分組

>>> out=re.match('\w{4,20}@(163|qq|126)\.com','test@qq.com')
>>> out
<re.Match object; span=(0, 11), match='test@qq.com'>

3,為分組命名,並通過別名來引用分組

>>> out=re.match(r"<(?P<name1>\w*)><(?P<name2>h[1-5])>.*</(?P=name2)></(?P=name1)>", "<html><h1>www.baidu.com</h1></html>")
>>> out
<re.Match object; span=(0, 35), match='<html><h1>www.baidu.com</h1></html>'>

 

參考文件:

Python 正規表示式(匹配分組)

相關文章