不是“ A”时,除非是“ AB”

时间:2019-02-22 10:09:00

标签: python

在解析ASCII文件时,我要在一行的行上执行一些操作。

该部分的长度将有所不同,因此我进行了while循环,该循环应继续直到到达以“ A”开头的行,表明该部分已结束。 但是,在此部分中,将包含一些以“ AB”开头的行。

所以我正在寻找类似的东西: 而不是line [0] ==“ A”,除非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 ”行。

3 个答案:

答案 0 :(得分:3)

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

例如,

^A(?!B).*

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

例如,您可能会匹配整个部分(假设您要匹配ZA的所有内容(除非AB除外),然后

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

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

答案 1 :(得分:2)

您可能要使用“或”

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

答案 2 :(得分:2)

我建议您尝试一下:

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

说明:

  • 这部分:line[0] != 'A' or说:如果该行不是以'A'开头,则继续进行迭代。但是,如果确实'A'开头,它将在确定下一个条件之前先检查下一个条件。
  • 最后,这一部分:line[0] != 'A'说,如果该行以'AB'开头,则继续进行迭代。但是,如果该行以'A'开头,然后再跟随其他任何内容,则中断。而这正是您想要的!。