首页 > 解决方案 > 虽然不是 "A" ,除非 "AB"

问题描述

在解析 ASCII 文件时,我想对一段行执行一些操作。

该部分的长度会有所不同,所以我做了一个while循环,它应该一直持续到我到达以“A”开头的一行,表明该部分已经结束。但是,在该部分中会有一些以“AB”开头的行,我想包括在内。

所以我正在寻找类似的东西:while not line[0] == "A", unless line[:2] == "AB"

即“AA”、“AC”、“A$”或“A-whatever”应该打破循环,但“AB”不应该。

我是新手,还没有找到合适的搜索词来解决这个问题,但我确定必须存在一个,还是我需要求助于正则表达式?

编辑:根据要求,这里是一个示例:

*SIGNAL* $$$1 2 -2 ; 
R1.2                            U1.36                           
3.1    3.635  0 0.3048 1792  THERMAL 
14.92  14     65 0.3048 1792  THERMAL 

*SIGNAL* $$$2 2 -2 ; 
R1.1                            U1.40                           
3.1    2.365  0 0.3048 1792  THERMAL 
18.984 14     65 0.3048 1792  THERMAL 

*SIGNAL* $$$3 2 -2 ; 
U1.16                           U1.22                           
24.064 26.7   0 0.3048 1792  THERMAL 
18     29.2   1 0.3048 1280 STANDARDVIA THERMAL  TEARDROP N 90 90 
17.968 29.168 1 0.3048 1536 
17.968 26.7   65 0.3048 768  THERMAL  TEARDROP P 90 90 
U1.16                           R3.2                            
24.064 26.7   1 0.3048 1280  THERMAL  TEARDROP N 90 90 
29     26.7   1 0.3048 1536 
29.7   26     1 0.3048 1536 
33.4   26     1 0.3048 1536 
33.4   26.035 65 0.3048 768  THERMAL  TEARDROP P 90 90 
U1.22                           U1.2                            
17.968 26.7   0 0.3048 1792  THERMAL 
21.016 14     65 0.3048 1792  THERMAL 
U1.26                           U1.22                           
13.142 24.922 0 0.3048 1792  THERMAL 
17.968 26.7   65 0.3048 1792  THERMAL 
R2.2                            U1.2                            
17     3.65   0 0.3048 1792  THERMAL 
21.016 14     65 0.3048 1792  THERMAL 

*SIGNAL* $$$4 2 -2 ; 
R2.1                            U1.4                            
17     2.35   0 0.3048 1792  THERMAL 
23.048 14     65 0.3048 1792  THERMAL 

*SIGNAL* $$$5 2 -2 ; 
R3.1                            U1.6                            
33.4   24.765 0 0.3048 1792  THERMAL 
25.842 15.778 65 0.3048 1792  THERMAL 

*TESTPOINT*
...

在这种情况下,下一部分称为“ TESTPOINT ”,但这会有所不同。唯一已知的字符是开头的“*”,所以不幸的是,它也包括所有的“ SIGNAL ”行。

标签: python

解决方案


这对于正则表达式来说是完美的。

例如,

^A(?!B).*

将匹配以 A 开头且之后没有 B 的行。

例如,您可以通过这种方式匹配整个部分(假设您想要匹配从Zto的所有内容A(除非AB),那么

(?s)^Z.*?^A(?!B)

会匹配的。如果您可以更准确地指定您的问题,则可以设计更具体的正则表达式。


推荐阅读