虽然不是“A”,除非“AB”

问题描述 投票:3回答:3

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

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

所以我正在寻找类似的东西:虽然不是行[0] ==“A”,除非行[: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
3个回答
2
投票

你可能想用“或”

while line[0] != "A" or line[:2] == "AB":
    # your code here

3
投票

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

例如,

^A(?!B).*

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

你可以用这种方式匹配整个部分,例如(假设你要匹配从ZA的所有东西(除非是AB),然后

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

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


2
投票

我建议你试试这个:

while line[0] != 'A' or line[:2] == 'AB':
    # code

说明:

  • 这部分:line[0] != 'A' or说:如果该行不是以'A'开头,那么继续迭代。但如果它确实从'A'开始,它将在决定下一步做什么之前检查下一个条件。
  • 最后,这部分:line[0] != 'A'说,如果该行以'AB'开头,则继续迭代。但是,如果这条线开始于'A'并且其他任何东西,那么就打破。这正是你想要的!
© www.soinside.com 2019 - 2024. All rights reserved.