正则表达式匹配中的分组匹配

分组的含义

在正则表达式中,需要在一个序列中匹配到的单元,在写编辑正则模板的时候用括号0 括起来。并且.为了方便给括号里面的内容璧值,可以采用group-Name,分组命名的方式,非常方便进行key-value方式的匹配。

python 中 使用re库的正则表达式的分组匹配:

直接用括号的例子:

#!/usr/bin/python

import re

line =“今天10点去上班可以吗?”

matchObi=re.match(r'([今明昨]天[0-9]{1,2}点)(上班|学车|学习)*' , line,

re.M|re.I)

if matchobj:

print "matchobj.group():",matchobj.group()

print "matchobj.group(1): ”,matchobj.qroup(1)

print"matchobj.group(2):",natchobj.group(2)

else:

print"No match!!

运行结果:

matchobj.group():今天10点去上班可以吗

matchobj.group(1)  :今天10点

matchobj.group(2): 上班

对分组的内容进行命名:

可以用(?p)的方式给分组的内容进行命名。

例子:

#/usr/bin/python

import re

line =  "今天10点上班"

matchobj = re.match(r'(?P<time>[今明昨]天[0-9](1,2)点)(?P<action>(上班|学车|学习)', line)

if matchobj:

print(matchobj.groupdict())

else:

print ("No match!!")

运行结果:

'time':‘今天10点’,'action':"上班'

c++中的RE2分组匹配:

c++中RE2库的含有group名称的分组匹配方式,也是如同python的re的用法;

(?Pre)

分组匹配的代码示例如下:

#include "re2/re2.h"

#include "stdlib.h"

#include <map>

#include<string>

#include<vector>

using namespace std;

int main(int argc, char** argv){

re2::RE2 retest("(?P<time>[今明昨]天[0-9]{1,2}点)去(?P<action>(上班|坐车|学习))");

string query ="今天10点去上班可以吗?"

const map<string, int> groupids=retest.NamedCapturingGroups();

int group_num=  retest.NumberofCapturingGroups()+ 1;

vector<re2::StringPiece> group(group_num);

int b = 0;

int e = query.length();

if (retest.Match(query, b, e, re2::RE2::Anchor::UNANCHORED, group.data(), group_num)){

for(auto pair : groupids){

int id = pair.second;

string wordm(group[id].data(). group[id].size());

cout <<"word:" << wordm;

cout << "value;  "<< pair.first << endl;

return 0;