如何使用Python提取.docx文件中加粗单词的位置?
提取DOCX中加粗内容的精准位置
嘿,完全懂你的痛点——只提取加粗单词确实没用,毕竟同一个词可能有的加粗有的没加粗,必须得知道它们在文档里的具体位置才能区分开。我来给你调整代码,让它能捕获每个加粗内容的精准位置信息。
核心思路
python-docx里的Run对象是格式的最小单元,我们可以通过记录段落索引、Run在段落中的索引,甚至字符偏移量来定位加粗内容。这样哪怕是相同的单词,只要位置不同,就能明确区分。
完整代码实现
from docx import Document def get_bold_with_positions(document_path): document = Document(document_path) bold_entries = [] # 遍历每个段落,用enumerate获取段落的索引 for para_idx, para in enumerate(document.paragraphs): # 记录当前run在段落中的起始字符位置 current_char_pos = 0 # 遍历段落里的每个run,同样获取run的索引 for run_idx, run in enumerate(para.runs): # 检查这个run是否是加粗格式 if run.font.bold: # 把位置信息和文本一起存入列表 bold_entry = { "段落索引": para_idx, "Run索引": run_idx, "段落内起始字符位置": current_char_pos, "加粗文本": run.text } bold_entries.append(bold_entry) # 更新字符位置,加上当前run的文本长度 current_char_pos += len(run.text) return bold_entries # 使用示例 if __name__ == "__main__": bold_content = get_bold_with_positions("/path/to/your/file.docx") for item in bold_content: print(f"段落{item['段落索引']},Run{item['Run索引']},起始位置{item['段落内起始字符位置']}:{item['加粗文本']}")
代码说明
- 段落与Run索引:用
enumerate获取段落和Run的索引,能快速定位到加粗内容所在的段落和具体格式单元。 - 字符偏移量:
current_char_pos记录每个Run在段落中的起始字符位置,能精准到具体哪个字符开始是加粗的,哪怕是单词的一部分加粗也能捕获。 - 可扩展性:如果需要整个文档的全局字符位置,只需要在函数开头加一个
global_char_pos变量,每次遍历完段落就加上段落的文本长度(记得算上段落末尾的换行符哦)。
举个例子,如果你的文档是:"My cat is not a normal cat",运行代码后会输出类似:
段落0,Run1,起始位置3:cat
这样你就能明确知道是第一个段落里的第2个Run(索引从0开始),从第3个字符开始的"cat"是加粗的,和后面没加粗的cat完全区分开。
内容的提问来源于stack exchange,提问作者Also




