如何在匹配模式后复制随后的文本?

2024-09-27 21:35:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个文本文件,每行都像这样-

GeneralBKT_n24_-e_dee_testcaseid_blt12_0001_s3_n4

每行都有关键字testcaseid,后跟一些测试用例id(在本例中,blt12_0001是id,s3n4是一些参数)。我想从上面的行中提取blt12_0001。每个testcaseid之间正好有一个下划线'\u1'。对于这种情况,什么是regex,如何将测试用例id的名称存储在变量中。你知道吗


Tags: id参数s3情况测试用例关键字dee文本文件
3条回答

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

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

这实际上捕获了一个文本,它们之间正好有一个下划线,前面是testcaseid_文本,使用正向lookback。这里[^_]+捕获除下划线以外的一个或多个任意字符,后跟_,然后再次使用[^_]+捕获除_之外的一个或多个任意字符

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

您可以利用捕获组:

testcaseid_([^_]+_[^_]+)

a demo on regex101.com


Python中许多可能的方法之一是
import re

line = "GeneralBKT_n24_-e_dee_testcaseid_blt12_0001_s3_n4"

for id in re.finditer(r'testcaseid_([^_]+_[^_]+)', line):
    print(id.group(1))

a demo on ideone.com。你知道吗

另一个可行的办法是:

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

正则表达式电路

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

enter image description here


如果您希望简化/修改/探索表达式,在regex101.com的右上面板中已经解释过了。如果您愿意,还可以在this link中查看它如何与一些示例输入匹配。你知道吗


相关问题 更多 >

    热门问题