我当前正在尝试获取介于2个子字符串之间的字符串。在这种情况下,我需要处理的字符串是一个代码块。不知道这是正则表达式还是搜索功能,但我一直没有回来,我不应该。我需要在第53行获得Offset,但是我需要使用Gusset To Backplate Left Gus 1作为开始标记,而ENDFOR我认为可能是结束标记。只是不太确定如何在python中使用类似语法的语法。我尝试了一些我在网上看到的示例,但到目前为止还没有运气。任何帮助,将不胜感激。我也想通过编译来做到这一点,因为偏移量可以被多次访问。
s = '''!GUSSET TO BACKPLATE LEFT GUS 1 ;
45: E_NO(8) ;
46: FOR R[191:COUNTER B]=1 TO R[199:CHANNELS] ;
47: ;
48: CALL CHAN_BP_TO_GR ;
49: ;
50: PR[GP1:2,1:OFFSET]=PR[GP1:2,1:OFFSET]-R[197:X OFFSET MM] ;
51: --eg:THESE OFFSETS ONLY APPLY TO THIS BLOCK AND INCREASE THE AMOUNT GIVEN
: EACH LOOP ;
52: !X OFFSET ;
53: PR[GP1:2,1:OFFSET]=PR[GP1:2,1:OFFSET]+21 ;
54: !Y OFFSET ;
55: PR[GP1:2,2:OFFSET]=PR[GP1:2,2:OFFSET]+0 ;
56: !Z OFFSET ;
57: PR[GP1:2,3:OFFSET]=PR[GP1:2,3:OFFSET]+0 ;
58: ENDFOR ;'''
string1 = re.compile('!GUSSET TO BACKPLATE LEFT GUS 1 ;')
string2 = re.compile('PR[GP1:2,1:OFFSET]=PR[GP1:2,1:OFFSET]+[0-9]* ;')
string3 = re.compile('ENDFOR ;')
result = re.search(r'!GUSSET TO BACKPLATE LEFT GUS 1 ;, (PR[GP1:2,1:OFFSET]=PR[GP1:2,1:OFFSET]+[0-9]* ;),ENDFOR ;', s)
'.(PR[GP1:2,1:OFFSET]=PR[GP1:2,1:OFFSET]+[0-9]* ;'
print(result)
答案 0 :(得分:0)
由于文本为多行,因此需要re.M标志。
使用。要匹配换行符,您还需要re.DOTALL标志。
!GUSSET。* PR [GP1:2,1:OFFSET] =将匹配所有文本,直到第53行的OFFSET,然后匹配所有非空格或;并保存要由result.group(1)返回的内容,如下所示。
(?! ENDFOR)。 ENDFOR。将匹配所有非ENDFOR的内容,然后是ENDFOR 这样可以防止它过于贪婪,并将匹配范围限制在此特定部分,并且不要跨越多个ENDFOR。
尝试
result = re.search('!GUSSET.*PR\[GP1:2,1:OFFSET\]=([^; ]+)(?!ENDFOR).*ENDFOR.*', s,re.M|re.DOTALL)
print(result.group(1))
这将返回
PR[GP1:2,1:OFFSET]+21