【问题标题】:Finding substring between string A and string B but ignoring certain string A's查找字符串 A 和字符串 B 之间的子字符串,但忽略某些字符串 A
【发布时间】:2021-12-30 23:42:29
【问题描述】:

我在 .txt 文件中有一段文本,内容如下:

调查结果概述

--datatext1

调查结果概述

--datatext2

调查结果概述

--datatext3

调查结果摘要

调查结果概述可以随机发生多次,也可以只发生一次。我只对 datatext3 (可变数量的文本)感兴趣。也就是说,只有最后一次出现的“OVERVIEW OF FINDINGS”和“SUMMARY OF FINDINGS”之间的文本。

有几篇文章介绍了如何使用re 以及如何拆分字符串以获得正确的文本。从他们那里我能够找到一个在下面有效的解决方案。但是,它是多个 for 循环和一个 if/elif append 循环。这似乎非常令人费解,我想知道我是否忽略了一个更简单的解决方案?

#Index all occurrences of OVERVIEW OF FINDINGS and SUMMARY OF FINDINGS:
    x = []
    y = []
    for i in re.finditer('OVERVIEW OF FINDINGS', data):
        x.append(i.start())
    for j in re.finditer('SUMMARY OF FINDINGS', data):
        y.append(j.start())

#Append to overview only when the next overview index is after the next summary index    
    n = 0
    overview = []
    for m in range(0,len(x)):
        if x[m] == x[-1]: #condition for last value in x or if only one value in x
            overview.append(data[x[m]+21:y[n]]) #(Note: OVERVIEW OF FINDINGS = +21)
        elif x[m+1] > y[n]:
            overview.append(data[x[m]+21:y[n]])
            if y[-1] == y[n]:
                break
            else:
                n += 1

【问题讨论】:

    标签: python regex


    【解决方案1】:

    这里不需要正则表达式;只需将字符串拆分到您要查找的子字符串上。

    start = 'OVERVIEW OF FINDINGS'
    end = 'SUMMARY OF FINDINGS'
    result = text.split(start)[-1].split(end)[0].strip()
    

    【讨论】:

      【解决方案2】:

      如果您愿意使用正则表达式,我们可以在这里使用re.findall

      inp = """OVERVIEW OF FINDINGS
      
      --datatext1
      
      OVERVIEW OF FINDINGS
      
      --datatext2
      
      OVERVIEW OF FINDINGS
      
      --datatext3
      
      SUMMARY OF FINDINGS"""
      
      text = re.findall(r'\bOVERVIEW OF FINDINGS\b(?!.*\bOVERVIEW OF FINDINGS\b)\s*(\S+)\s+SUMMARY OF FINDINGS', inp, flags=re.S)[0]
      print(text)  # --datatext3
      

      正则表达式模式使用否定前瞻来断言OVERVIEW OF FINDINGS 仅在它是整个文本中的最后一个 时才匹配。下面是正则表达式模式的解释:

      \bOVERVIEW OF FINDINGS\b        match 'OVERVIEW...'
      (?!.*\bOVERVIEW OF FINDINGS\b)  assert that no more 'OVERVIEW...' occurs
      \s*                             optional whitespace
      (\S+)                           match content
      \s+                             match whitespace
      SUMMARY OF FINDINGS             match 'SUMMARY...'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-03-23
        • 2022-11-27
        • 1970-01-01
        • 2016-10-08
        • 1970-01-01
        • 1970-01-01
        • 2021-09-29
        • 1970-01-01
        相关资源
        最近更新 更多