提取任意表达式组合之间的文本(列表)
Extract text between any combination of expressions (list)
我需要从一个文本文件(一个字母的开头和结尾,嵌入在一个更大的文件中)中提取两个表达式(开头和结尾)之间的文本。我面临的问题是字母的开头和结尾都有多种可能的表达方式。
我有一个表达式列表,可能符合开始/结束表达式的条件。我需要从较大的文本(包括开始和结束表达式)中提取这些表达式的任意组合之间的所有文本,并将其写入新文件。
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)
以上示例包括 "Dear" 作为 letter_begin 表达式和 "Sincerly" 作为 letter_end 表达式。我需要一个灵活的代码,它能够从上面的列表中捕获任何开头和结尾的字母表达式(表达式的任何潜在组合;例如 "Dear [...] rest regards" 或 "Estimated [...] Sincerly")
我们可以尝试在全点和多行模式下使用 re.findall
,使用以下模式:
Dear\s+.*?Sincerely,\n\S+
这将捕获并包括从单词 Dear
开始并包括 Sincerely
的所有内容,然后是 Sincerely
之后下一行之后的所有内容。这是一个代码示例:
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**']
我需要从一个文本文件(一个字母的开头和结尾,嵌入在一个更大的文件中)中提取两个表达式(开头和结尾)之间的文本。我面临的问题是字母的开头和结尾都有多种可能的表达方式。
我有一个表达式列表,可能符合开始/结束表达式的条件。我需要从较大的文本(包括开始和结束表达式)中提取这些表达式的任意组合之间的所有文本,并将其写入新文件。
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)
以上示例包括 "Dear" 作为 letter_begin 表达式和 "Sincerly" 作为 letter_end 表达式。我需要一个灵活的代码,它能够从上面的列表中捕获任何开头和结尾的字母表达式(表达式的任何潜在组合;例如 "Dear [...] rest regards" 或 "Estimated [...] Sincerly")
我们可以尝试在全点和多行模式下使用 re.findall
,使用以下模式:
Dear\s+.*?Sincerely,\n\S+
这将捕获并包括从单词 Dear
开始并包括 Sincerely
的所有内容,然后是 Sincerely
之后下一行之后的所有内容。这是一个代码示例:
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**']