在需求文档清理过程中,有时需要根据预先配置的关键词列表,过滤掉标题中包含某些特定关键元素的段落内容。例如,用户可能希望忽略某些章节或段落(如 “附录”、“参考文献”)中的内容。为实现这一需求,我们可以扩展现有的文档清理工具,通过配置关键词列表,自动过滤掉标题中包含这些关键词的段落。
以下是功能的实现步骤:
在需求文档中,标题的格式可能不固定,例如:
为了更通用地判断和提取标题,我们可以设计一种多规则的匹配方法,结合以下特征来判断段落是否为标题:
以下是实现通用标题判断和内容过滤的完整方案。
样式判断:
正则表达式匹配:
^\d+(\.\d+)*\s+.*
1. 概述
、4.1 功能描述
。^\d+[-]\d+\s+.*
4-1 功能描述
。^(附录|参考文献|功能要求|概述).*$
附录A
、功能要求
。关键词匹配:
以下代码实现了通用标题判断和基于标题过滤内容的功能。
import re
from docx import Document
def is_title(paragraph, filter_list=None):
"""
判断段落是否为标题
:param paragraph: 段落对象
:param filter_list: 预配置的关键词列表(可选)
:return: 是否为标题(True/False)
"""
# 获取段落文本
text = paragraph.text.strip()
# 空段落不可能是标题
if not text:
return False
# 样式判断(适用于规范化文档)
if paragraph.style.name.startswith("Heading"):
return True
# 正则表达式匹配标题格式
if re.match(r"^\d+(\.\d+)*\s+.*", text): # 数字开头的标题
return True
if re.match(r"^\d+[-]\d+\s+.*", text): # 带 "-" 的标题
return True
if re.match(r"^(附录|参考文献|功能要求|概述).*$", text): # 特定关键词的标题
return True
# 关键词匹配(如果提供了过滤关键词列表)
if filter_list and any(keyword in text for keyword in filter_list):
return True
# 默认不是标题
return False
def filter_content_by_title(docx_path, filter_list):
"""
根据标题中的关键词过滤段落内容
:param docx_path: docx 文件路径
:param filter_list: 预先配置的关键词列表
:return: 过滤后的文档内容
"""
doc = Document(docx_path)
filtered_content = []
skip_section = False # 用于标记是否跳过当前段落内容
for paragraph in doc.paragraphs:
text = paragraph.text.strip()
# 判断是否是标题
if is_title(paragraph, filter_list):
# 如果标题中包含过滤列表中的关键词,跳过该段落
if any(keyword in text for keyword in filter_list):
skip_section = True
continue
else:
skip_section = False
# 如果当前段落不属于需要过滤的章节,则保留
if not skip_section and text:
filtered_content.append(text)
return "\n".join(filtered_content)
# 示例调用
docx_path = "需求文档.docx"
# 配置要过滤的标题关键词列表
filter_list = ["附录", "参考文献", "声明"]
# 调用函数过滤内容
filtered_text = filter_content_by_title(docx_path, filter_list)
# 打印过滤后的内容
print("过滤后的文档内容:")
print(filtered_text)
is_title
函数:
filter_content_by_title
函数:
is_title
判断段落是否为标题。预先配置的关键词列表:
filter_list
配置需要过滤的关键元素,例如 ["附录", "参考文献", "声明"]
。标题匹配规则:
数字.数字 标题
(如 4.1 功能描述
)。^\d+(\.\d+)*\s+.+
匹配标题格式。跳过过滤段落:
skip_section = True
,跳过该标题及其正文内容。保留其余内容:
如果文档中的标题格式不固定,可以调整正则表达式,适配更多标题样式。例如:
数字-数字 标题
格式:re.match(r"^\d+(-\d+)*\s+.+", text)
附录
、参考文献
):if any(keyword in text for keyword in filter_list):
可以将过滤列表存储在外部配置文件(如 JSON 文件)中,方便用户动态调整。例如:
import json
def load_filter_list(config_path="filter_config.json"):
"""
从配置文件加载过滤关键词列表
:param config_path: 配置文件路径
:return: 关键词列表
"""
try:
with open(config_path, "r", encoding="utf-8") as file:
return json.load(file).get("filter_list", [])
except FileNotFoundError:
print(f"配置文件 {config_path} 未找到,使用默认过滤列表。")
return []
# 示例配置文件内容:
# {
# "filter_list": ["附录", "参考文献", "声明"]
# }
filter_list = load_filter_list("filter_config.json")
为了调试过滤逻辑,可以输出匹配到的标题列表,方便用户验证。例如:
matched_titles = []
for paragraph in doc.paragraphs:
text = paragraph.text.strip()
if re.match(r"^\d+(\.\d+)*\s+.+", text):
if any(keyword in text for keyword in filter_list):
matched_titles.append(text)
print("匹配到的标题:")
print("\n".join(matched_titles))
如果需要同时过滤标题中的表格和图片,可以扩展逻辑,检查表格和图片是否属于被过滤的章节。例如:
for paragraph in doc.paragraphs:
text = paragraph.text.strip()
if re.match(r"^\d+(\.\d+)*\s+.+", text):
if any(keyword in text for keyword in filter_list):
skip_section = True
continue
else:
skip_section = False
# 跳过属于被过滤章节的表格和图片
if not skip_section:
# 处理表格和图片
...
1. 概述
这是文档的概述部分。
2. 功能要求
2.1 功能描述
这是功能描述的内容。
附录A
这是附录的内容,不需要提取。
3. 技术要求
这是技术要求部分。
参考文献
这是参考文献部分,不需要提取。
过滤关键词列表:
filter_list = ["附录", "参考文献"]
过滤后的结果:
1. 概述
这是文档的概述部分。
2. 功能要求
2.1 功能描述
这是功能描述的内容。
3. 技术要求
这是技术要求部分。
为了适应更多标题样式,可以动态调整标题匹配规则。例如:
修改代码如下:
# 支持标题后带特殊标记
if re.match(r"^\d+(\.\d+)*\s+.*[\((].*[\))]$", text): # 示例:4.1 功能描述(重要)
return True
将过滤后的内容导出为 txt
、json
或其他格式,便于进一步处理。
# 导出为 TXT 文件
with open("filtered_content.txt", "w", encoding="utf-8") as file:
file.write(filtered_text)
# 导出为 JSON 文件
import json
with open("filtered_content.json", "w", encoding="utf-8") as file:
json.dump({"content": filtered_text}, file, ensure_ascii=False, indent=4)
将标题过滤功能集成到图形用户界面(GUI),允许用户动态输入过滤关键词和调整匹配规则。
from PyQt5.QtWidgets import QLineEdit, QPushButton, QTextEdit, QVBoxLayout, QMainWindow, QApplication
class FilterContentApp(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("文档内容过滤工具")
self.setGeometry(100, 100, 600, 400)
self.init_ui()
def init_ui(self):
layout = QVBoxLayout()
# 输入过滤关键词
self.filter_input = QLineEdit(self)
self.filter_input.setPlaceholderText("请输入过滤关键词(用逗号分隔)")
layout.addWidget(self.filter_input)
# 显示过滤后的内容
self.result_display = QTextEdit(self)
layout.addWidget(self.result_display)
# 按钮:开始过滤
filter_button = QPushButton("开始过滤", self)
filter_button.clicked.connect(self.filter_content)
layout.addWidget(filter_button)
# 设置窗口布局
container = QWidget()
container.setLayout(layout)
self.setCentralWidget(container)
def filter_content(self):
# 获取用户输入的关键词
filter_list = self.filter_input.text().split(",")
docx_path = "需求文档.docx"
# 调用过滤函数
filtered_text = filter_content_by_title(docx_path, filter_list)
# 显示结果
self.result_display.setPlainText(filtered_text)
# 主程序入口
if __name__ == "__main__":
app = QApplication([])
window = FilterContentApp()
window.show()
app.exec_()
通过通用标题判断方法,我们能够适配格式不固定的标题,动态过滤需求文档中的无用内容。结合强大的正则表达式匹配和关键词判断逻辑,工具可以高效处理多种文档结构,满足各种复杂场景需求。添加基于预先配置列表的标题过滤功能,我们能够高效跳过需求文档中指定章节或段落的内容。结合灵活的正则匹配规则和 GUI 集成,该功能可以满足用户的多样化需求,并显著提升文档清理工具的实用性和智能化水平。