分组的含义
在正则表达式中,需要在一个序列中匹配到的单元,在写编辑正则模板的时候用括号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;