我有一个文本文件,每一行看起来都是这样-
GeneralBKT_n24_-e_dee_testcaseid_blt12_0001_s3_n4
每行的关键字为testcaseid
,后跟一些测试用例ID(在这种情况下,blt12_0001
是ID,s3
和n4
是一些参数)。我想从上面的行中提取blt12_0001
。每个testcaseid之间将恰好有1个下划线“ _”。这种情况下的正则表达式是什么,如何将测试用例ID的名称存储在变量中。
答案 0 :(得分:1)
您可以使用此正则表达式来捕获以您的格式给出的testcaseid,
(?<=testcaseid_)[^_]+_[^_]+
这实际上捕获了一个文本,它们之间只有一个下划线,并在testcaseid_
之前加上正向后缀。这里的[^_]+
捕获下划线以外的任何一个或多个字符,接着是_
,然后再次使用[^_]+
捕获除_
以外的任何一个或多个字符
查看此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;
}
testcaseid_([^_]+_[^_]+)
中许多可能的方式之一可能是
Python
答案 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']
jex.im可视化正则表达式:
如果您希望简化/修改/探索表达式,请在regex101.com的右上角进行说明。如果愿意,您还可以在this link中查看它如何与某些示例输入匹配。