首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >正则表达式仅在前面的所有行都有关键字时才捕获。

正则表达式仅在前面的所有行都有关键字时才捕获。
EN

Stack Overflow用户
提问于 2022-04-06 12:53:39
回答 1查看 35关注 0票数 -1

我希望有一个正则表达式,只有在前面的行都以关键字'PASS‘开头时,它才能与CLPM_FPGA_xx ID匹配

如果前面的任何一行以单词“FAIL”开头,则不应提取CLPM_FPGA_xx ID

我认为这比较容易,但由于前面的行数是可变的,失败行可能是第一、最后或中间的,所以我一直在挣扎

如有任何建议请见谅。

==示例数据========

通过:锁相环锁定信号在复位状态为0。

通过:锁相环锁定信号状态为1。

传球:锁相环锁定在预期时间内: 5000000 ps。

需求验证: CLPM_FPGA_31

关卡:系统时钟高峰周期为8000 ps。

失败:系统时钟低周期是8000 ps。

关卡:系统时钟周期为16000 ps。

需求验证: CLPM_FPGA_32

通行证:系统时钟到国际金融公司的延迟是10 ps。

需求验证: CLPM_FPGA_31

通行证:系统时钟到国际金融公司的延迟是10 ps。

需求验证: CLPM_FPGA_34

失败:系统时钟低周期是8000 ps。

关卡:系统时钟高峰周期为8000 ps。

关卡:系统时钟周期为16000 ps。

需求验证: CLPM_FPGA_32

关卡:系统时钟高峰周期为8000 ps。

关卡:系统时钟周期为16000 ps。

失败:系统时钟低周期是8000 ps。

需求验证: CLPM_FPGA_32

失败:系统时钟低周期是8000 ps。

需求验证: CLPM_FPGA_33

=====================================

Reg Exp尝试:

^(?!(FAIL:|Requirements)).(\n^PASS:.)+\nRequirements验证:\t+(CLPM_FPGA_.*)

但是,这与在失败后立即发生传球的情况相匹配。

EN

回答 1

Stack Overflow用户

发布于 2022-04-06 13:21:04

其思想是在块上拆分文本,过滤出具有“失败”状态的块,然后找到id。

注意:为了更好地控制匹配,我将ids替换为非重复编号(从31到37)。

可能的解决办法如下:

代码语言:javascript
复制
import re

string = """PASS: PLL Lock signal state at reset is 0.
PASS: PLL Lock signal state is 1.
PASS: PLL Locked within expected time: 5000000 ps.
Requirements verified: CLPM_FPGA_31

PASS: System Clock high period is 8000 ps.
FAIL: System Clock low period is 8000 ps.
PASS: System Clock period is 16000 ps.
Requirements verified: CLPM_FPGA_32

PASS: System Clock to IFC delay is 10 ps.
Requirements verified: CLPM_FPGA_33

PASS: System Clock to IFC delay is 10 ps.
Requirements verified: CLPM_FPGA_34

FAIL: System Clock low period is 8000 ps.
PASS: System Clock high period is 8000 ps.
PASS: System Clock period is 16000 ps.
Requirements verified: CLPM_FPGA_35

PASS: System Clock high period is 8000 ps.
PASS: System Clock period is 16000 ps.
FAIL: System Clock low period is 8000 ps.
Requirements verified: CLPM_FPGA_36

FAIL: System Clock low period is 8000 ps.
Requirements verified: CLPM_FPGA_37"""

string_blocks = string.split("\n\n")


re_pattern = re.compile(r"PASS.+\n.+CLPM_FPGA_(\d+)$", re.M)

result = []

for string_block in string_blocks:
    if 'FAIL' not in string_block:
        found = re_pattern.findall(string_block)
        result.extend(found)

print(result)

指纹:

代码语言:javascript
复制
['31', '33', '34']
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71767131

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档