【问题标题】:How to get string from in between 2 strings如何从两个字符串之间获取字符串
【发布时间】:2019-04-18 01:19:54
【问题描述】:

我目前正在尝试获取介于 2 个子字符串之间的字符串。在这种情况下,我需要操作的字符串是一段代码。不确定它是正则表达式还是搜索功能,但我一直没有得到任何回复,我不应该这样做。我需要在第 53 行获得偏移量,但我需要使用 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)

【问题讨论】:

    标签: regex python-3.x string text


    【解决方案1】:

    由于您的文本是多行的,您将需要 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
    

    【讨论】:

    • 如果有问题的字符串也在文本文件中,这条多行规则是否成立?
    • 文本文件就是文本。如果文本文件有换行符 [en.wikipedia.org/wiki/Newline] 并且您想跨多行搜索,那么您需要多行标志和 dotall 标志。
    • 我在这里断断续续地搞砸了几天。在我看来,以某种方式在文件中查找它总是返回一个无值。但是,当使用您在直接放入程序的字符串中提供的代码时,它会正常工作。我也可以正确访问文件,因为读取或写入没有问题。使用其他正则表达式,我可以访问某些东西。只是似乎无法弄清楚字符串之间的字符串。
    • NVD。当我尝试遍历文件文本时它不起作用。不过它现在可以工作了。
    • 出了什么问题?
    猜你喜欢
    • 2013-11-25
    • 2012-12-28
    • 1970-01-01
    • 2012-09-17
    • 1970-01-01
    • 1970-01-01
    • 2015-10-09
    相关资源
    最近更新 更多