Python 而不是",;“A”,除非;AB";

Python 而不是",;“A”,除非;AB";,python,Python,在解析ASCII文件时,我想对一段行执行一些操作 节的长度会有所不同,所以我做了一个while循环,该循环应该一直持续到我到达一条以“a”开头的线,表示节已经结束。 然而,在这一部分中,会有一些以“AB”开头的行,我想包括在内 所以我在寻找这样的东西: 而不是第[0]=“A”行,除非第[:2]=“AB”行 例如,“AA”、“AC”、“A$”或“A-无论什么”应打破循环,但“AB”不应打破循环 我是一个新手,还没有找到合适的搜索词来解决这个问题,尽管我肯定有一个搜索词,或者我需要使用正则表达式吗

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

节的长度会有所不同,所以我做了一个while循环,该循环应该一直持续到我到达一条以“a”开头的线,表示节已经结束。 然而,在这一部分中,会有一些以“AB”开头的行,我想包括在内

所以我在寻找这样的东西: 而不是第[0]=“A”行,除非第[:2]=“AB”行

例如,“AA”、“AC”、“A$”或“A-无论什么”应打破循环,但“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”,但这将有所不同。唯一已知的字符是开头的“*”,不幸的是,它也包括所有的“信号”行。

您可能需要使用“或”


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

比如说,

^A(?!B).*
将匹配以a开头的行,之后没有B

例如,您可以通过这种方式匹配整个部分(假设您希望匹配从
Z
A
(除非
AB
),然后


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

我建议您尝试以下方法:

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

  • 这部分:
    行[0]!='A'或
    表示:如果该行不是以
    'A'
    开头,则继续迭代。但是如果它确实以
    'A'
    开头,它将在决定下一步操作之前检查下一个条件
  • 最后,这一部分:
    line[0]!='A'
    表示,如果该行以
    'AB'
    开头,则继续迭代。但如果该行以
    'A'
    开头,后面跟着其他任何内容,则中断。这正是您想要的

显示文件中的几行可能会有帮助。这是否要求每一行都以“AB”开头?情况并非如此,而且有些行是空的。不,因为它是“或”,而不是“和”。因此,要执行,您的行要么以“AB”开头,要么不以“a”开头。@除非我用详细的解释更新了我的答案,请检查:)@以免我也删除了空白检查,如果您的输入可以包含空行,那么它就没有意义。很难知道你需要什么,因为你从来没有发布过你读每一行的准确程度……谢谢@Fukiyel,我的错。你的解决方案很有效。一旦你看到它,它就变得如此简单。:)请看我对奥斯卡·洛佩斯的评论。
(?s)^Z.*?^A(?!B)
while line[0] != 'A' or line[:2] == 'AB':
    # code