匹配模式后如何复制后续文本?

时间:2019-10-10 18:27:20

标签: python regex

我有一个文本文件,每一行看起来都是这样-

GeneralBKT_n24_-e_dee_testcaseid_blt12_0001_s3_n4

每行的关键字为testcaseid,后跟一些测试用例ID(在这种情况下,blt12_0001是ID,s3n4是一些参数)。我想从上面的行中提取blt12_0001。每个testcaseid之间将恰好有1个下划线“ _”。这种情况下的正则表达式是什么,如何将测试用例ID的名称存储在变量中。

3 个答案:

答案 0 :(得分:1)

您可以使用此正则表达式来捕获以您的格式给出的testcaseid,

(?<=testcaseid_)[^_]+_[^_]+

这实际上捕获了一个文本,它们之间只有一个下划线,并在testcaseid_之前加上正向后缀。这里的[^_]+捕获下划线以外的任何一个或多个字符,接着是_,然后再次使用[^_]+捕获除_以外的任何一个或多个字符

Check out this demo

查看此Python代码,

import re

list = ['GeneralBKT_n24_-e_dee_testcaseid_blt12_0001_s3_n4', 'GeneralBKT_n24_-e_dee_testcaseid_blt12_0001_s6_n9']

for s in list:
 grp = re.search(r'(?<=testcaseid_)[^_]+_[^_]+', s)
 if grp:
  print(grp.group())

输出

blt12_0001
blt12_0001

答案 1 :(得分:1)

您可以利用捕获组:

#include <iostream>
#include <string>
using namespace std;

int main()
{
    string symb;

    cout << "Enter Symbol: ";
    cin >> symb;

    if (symb == "co2")
    {
        cout << "This is Carbon-Dioxide" << endl;
    }
    else
    {
        cout << "Error" << endl;
    }

    return 0;
}

请参见a demo on regex101.com


testcaseid_([^_]+_[^_]+) 中许多可能的方式之一可能是

Python

请参见a demo on ideone.com

答案 2 :(得分:1)

另一个可行的选择是:

import re
expression = r"[^_\r\n]+_[^_\r\n]+(?=(?:_[a-z0-9]{2}){2}$)"

string = '''

GeneralBKT_n24_-e_dee_testcaseid_blt12_0001_s3_n4
GeneralBKT_n24_-e_dee_testcaseid_blt81_0023_s4_n5

'''

print(re.findall(expression, string, re.M))

输出

['blt12_0001', 'blt81_0023']

Demo

RegEx电路

jex.im可视化正则表达式:

enter image description here


如果您希望简化/修改/探索表达式,请在regex101.com的右上角进行说明。如果愿意,您还可以在this link中查看它如何与某些示例输入匹配。