Python 在任意表达式组合之间提取文本(列表)

Python 在任意表达式组合之间提取文本(列表),python,regex,text-mining,text-extraction,Python,Regex,Text Mining,Text Extraction,我需要从文本文件(嵌入在较大文件中的字母的开头和结尾)中提取两个表达式(开头和结尾)之间的文本。我面临的问题是,这封信的开头和结尾都有多种可能的表达方式 我有一个表达式列表,这些表达式可能符合开始/结束表达式的条件。我需要从较大的文本(包括开始和结束表达式)中提取这些表达式的任意组合之间的所有文本,并将其写入新文件 sample_text = """Some random text asdasd asdasd asdasd **Dear my friend, this is the text

我需要从文本文件(嵌入在较大文件中的字母的开头和结尾)中提取两个表达式(开头和结尾)之间的文本。我面临的问题是,这封信的开头和结尾都有多种可能的表达方式

我有一个表达式列表,这些表达式可能符合开始/结束表达式的条件。我需要从较大的文本(包括开始和结束表达式)中提取这些表达式的任意组合之间的所有文本,并将其写入新文件

sample_text = """Some random text 
asdasd
asdasd
asdasd
**Dear my friend,
this is the text I want to extract.
Sincerly,
David**
some other random text
adasdsasd"""
到目前为止,我的代码是:

letter_begin = ["dear", "to our", "estimated", ...]
letter_end = ["sincerly", "yours", "best regards", ...]

with open('path/to/input') as infile, open('path/to/output', 'w') as outfile:
    copy = False
    for line in infile:
        if line.strip() == "dear": #shortcomming: only 1 Expression possible here
            copy = True
        elif line.strip() == "sincerly": #shortcomming: only 1 Expression possible here
            copy = False
        elif copy:
            outfile.write(line)

上面的例子包括“亲爱的”作为字母的开头表达式,“真诚的”作为字母的结尾表达式。我需要一个灵活的代码,它能够从上面的列表中捕获任何开头和结尾字母表达式(表达式的任何潜在组合;例如“亲爱的[…]休息问候”或“估计的[…]真诚”)

我们可以尝试在点全和多行模式下使用
re.findall
,模式如下:

Dear\s+.*?Sincerely,\n\S+
这将捕获并包括所有内容,从单词
亲爱的
,到
真诚的
,然后是
真诚的
后面下一行的内容。下面是一个代码示例:

output = re.findall(r"Dear\s+.*?Sincerely,\n\S+", sample_text, re.MULTILINE|re.DOTALL)
print(output)
编辑:

如果您想匹配多个可能的问候语和结束语,那么我们可以使用替代:

letter_begin = ["dear", "to our", "estimated"]
openings = '|'.join(letter_begin)
print(openings)
letter_end = ["sincerely", "yours", "best regards"]
closings = '|'.join(letter_end)
regex = r"(?:" + openings + r")\s+.*?" + r"(?:" + closings + r"),\n\S+"
output = re.findall(regex, sample_text, re.MULTILINE|re.DOTALL|re.IGNORECASE)
print(output)

['Dear my friend,\nthis is the text I want to extract.\nSincerely,\nDavid**']

你到底想从上面的文本中提取什么?嗨,蒂姆,我想提取“亲爱的我的朋友,这是我想提取的文本。真诚的,大卫”,其中“亲爱的”标记字母的开头,“真诚的”标记字母的结尾-开头和结尾的标识必须灵活,因为我想循环一堆文件(使用不同的开头和结尾表达式)所以您只想提取一行,其中包含
亲爱的我的朋友
,对吗?不,我想提取所有文本,从“亲爱的”开始,到“Sincerly”[+Word after,这是名称”。从我上面的示例中,所需的输出将是“亲爱的朋友,这是我想提取的文本。诚恳地说,大卫“非常感谢你的解答。蒂姆。如果我没有弄错,那么这个解决方案只适合表达“亲爱的”和“诚恳的”,但不会在开头(例如“估计的朋友”)或结尾(例如“最好的问候”)捕捉任何其他表达正确吗?是的,没错。如果你有其他逻辑,我可以编辑我的答案。一般来说,要使用正则表达式,你需要知道你想要匹配的文本。正则表达式不能真正进行机器学习,也不能猜测内容。好的,明白了,有没有办法让正则表达式搜索任何出现的表达式列表(在本例中为字母\u开始列表)和“记录”从出现到出现其他列表(在本例中为字母\u结束列表)中表达式的所有文本?是的,我们可以使用替代选项。编辑您的问题,并提供必要的信息。我发布的内容回答了您实际提出的问题。@DominikScheld回答已更正,您可以尝试。