【问题标题】:Python text extraction from letter - index从字母中提取Python文本 - 索引
【发布时间】:2018-11-20 13:47:31
【问题描述】:

我想用 Python 从一个 txt 文件中提取一个字母的某个部分。开头和结尾由清晰的开头/结尾表达式(letter_begin / letter_end)标记。我的问题是文本的“记录”需要从 letter_begin 列表中任何项目的第一次出现开始,并在 letter_end 列表中的最后一项(+3 行缓冲区)结束。我想将输出文本写入文件。到目前为止,这是我的示例文本和代码:

sample_text = """Some random text right here 
.........
Dear Shareholders: We are pleased to provide this report to our shareholders and fellow shareholders. we thank you for your continued support.
Best regards, 
Douglas - Director


Other random text in this lines """

letter_begin = ["dear", "to our shareholders", "fellow shareholders"]
letter_end = ["best regards", "respectfully submitted", "thank you for your continued support"]

with open(filename, 'r', encoding="utf-8") as infile, open(xyz.txt, mode = 'w', encoding="utf-8") as f: 
        text = infile.read()
        lines = text.strip().split("\n")
        target_start_idx = None
        target_end_idx = None
        for index, line in enumerate(lines):
            line = line.lower()
            if any(beg in line for beg in letter_begin):
                target_start_idx = index
                continue
            if any(end in line for end in letter_end):
                target_end_idx = index + 3
                break


        if target_start_idx is not None:
            target = "\n".join(lines[target_start_idx : target_end_idx])
            f.write(str(target))

我想要的输出应该是:

output = "Dear Shareholders: We are pleased to provide this report to our shareholders and fellow shareholders. we thank you for your continued support.
    Best regards, 
    Douglas - Director

    "

【问题讨论】:

    标签: python nlp text-extraction


    【解决方案1】:

    您的循环为您提供了最后次出现的开始序列。

    您应该将读取部分分成两个循环,如下所示:

    with open(filename, 'r', encoding="utf-8") as infile:
    
        text = infile.read()
        lines = text.strip().split("\n")
        target_start_idx = None
        target_end_idx = None
        for index, line in enumerate(lines):
            line = line.lower()
            if any(beg in line for beg in letter_begin):
                target_start_idx = index
                break
        for index, line in enumerate(lines):
            if any(end in line for end in letter_end):
                target_end_idx = index + 3
                continue
    

    这样,当出现第一次开始序列时,您退出循环。

    【讨论】:

    • 非常感谢!您的解决方案在这两种情况下都捕获了第一次出现,对吗?但我想在第二种情况下最后一次出现(letter_end) - 知道怎么做吗?
    • 是的,这个想法是循环应该继续运行,直到所有行都与 letter_end 进行比较。我已经编辑了代码以反映这一点。
    猜你喜欢
    • 2016-01-21
    • 2022-07-07
    • 2014-01-14
    • 2020-10-30
    • 2023-03-31
    • 1970-01-01
    • 2017-07-19
    • 2016-11-05
    • 1970-01-01
    相关资源
    最近更新 更多