【问题标题】:Extract text between two pieces of text提取两段文本之间的文本
【发布时间】:2017-01-31 10:37:34
【问题描述】:

我正在尝试使用 Python 来提取以下标题之间的文本:

@HEADER1
ExtractMe
ExtractMe
ExtractMe
ExtractMe
ExtractMe
ExtractMe
ExtractMe
ExtractMe
ExtractMe
@othertext

@HEADER1 + @othertext 的确切文本可能会随着时间而改变。所以我需要保持活力。

另外,HEADER2 是一个以'@' 开头的词。那么我可以使用startswith 函数吗?还是正则表达式?

类似的东西。

For line in file:
    if(line == 'HEADER1'):
        print next line
        continue = TRUE
    if(continue == TRUE):
        print(line)
    elif(line == othertext):
        break

【问题讨论】:

  • 您的内容中没有HEADER2
  • line.startswith("@") 会找到以@开头的单词
  • 不要做if line == '@HEADER1',做if line.startswith('@HEADER1')。使用第一个选项,您会忘记换行符。并且不要使用 python 内置的continueFor 也用小写“f”拼写
  • 你不应该考虑@等吗?

标签: python regex python-3.x text-extraction


【解决方案1】:

这样就可以了

import re

string = """@HEADER1
ExtractMe
ExtractMe
ExtractMe
ExtractMe
ExtractMe
ExtractMe
ExtractMe
ExtractMe
ExtractMe
@othertext"""

print '"{}"'.format(re.split(r'(@HEADER1[\n\r]|[\n\r]@othertext)', string)[2])

输出:

"ExtractMe
ExtractMe
ExtractMe
ExtractMe
ExtractMe
ExtractMe
ExtractMe
ExtractMe
ExtractMe"

【讨论】:

  • 如果换行符是\r\n,这是否有效?
【解决方案2】:

看起来像这样?

import re

string = """@HEADER1
ExtractMe
ExtractMe
ExtractMe
ExtractMe
ExtractMe
ExtractMe
ExtractMe
ExtractMe
ExtractMe
@othertext
@HEADER2
ExtractMe2
ExtractMe2
ExtractMe2
ExtractMe2
ExtractMe2
ExtractMe2
ExtractMe2
ExtractMe2
ExtractMe2
@othertext"""

for a in re.findall(r'@\w+(?:\r\n|\r|\n)(.*?)@\w+(?:\r\n|\r|\n)?', string, re.DOTALL):
    print a

输出:

ExtractMe
ExtractMe
ExtractMe
ExtractMe
ExtractMe
ExtractMe
ExtractMe
ExtractMe
ExtractMe

ExtractMe2
ExtractMe2
ExtractMe2
ExtractMe2
ExtractMe2
ExtractMe2
ExtractMe2
ExtractMe2
ExtractMe2

【讨论】:

    【解决方案3】:

    不重复

    string = """@HEADER1
        ExtractMe
        ExtractMe
        ExtractMe
        ExtractMe
        ExtractMe
        ExtractMe
        ExtractMe
        ExtractMe
        ExtractMe
        @othertext"""
    

    您可以在字符串拼接中使用str.find。像这样:

    print(string[string.find("\n"):string.find("\n@")])
    

    或者你可以把字符串变成一个列表,得到你想要的元素,然后像这样把它重新组合在一起......

    list = string.split("\n")
    list = list[1:len(list)-1]
    print("\n".join(list))
    

    【讨论】:

      【解决方案4】:

      我在这种情况下使用 partition() 方法

      text_to_extract = "@HEADER1\nExtractMe\nExtractMe\nExtractMe\nExtractMe\nExtractMe\nExtractMe\nExtractMe\nExtractMe\nExtractMe\n@othertext"
      extracted = text_to_extract.partition('@HEADER1')[2].partition('@othertext')[0]
      print (extracted)
      

      输出:

      ExtractMe  
      ExtractMe  
      ExtractMe  
      ExtractMe  
      ExtractMe  
      ExtractMe
      ExtractMe  
      ExtractMe  
      ExtractMe  
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-11-02
        • 2013-10-05
        • 1970-01-01
        • 1970-01-01
        • 2011-12-31
        • 2019-07-02
        • 1970-01-01
        相关资源
        最近更新 更多