首页 > 解决方案 > 使用python突出显示word文档中的某些单词

问题描述

我想突出显示给定单词文档中的所有给定单词,但是,我只能突出显示句子中的第一个单词...

示例:假设我在 word 文档中有以下单词,并且我想突出显示以下单词:Approximate Pending May。虽然它在前四行运行良好,但在第五行我只能突出显示“待定”

Approximate 
Pending spending 
May
May
Pending Approximate xx sit May 

这是我的代码,你能帮我解决这个问题吗?

from docx import Document
from docx.enum.text import WD_COLOR_INDEX
import pandas as pd
import os
import re


path = r"C:\\Users\\files\\"
input_file =  r"C:\\Users\\files\\\Dictionary.xlsx"


# List of words
df = pd.read_excel(input_file) 
my_list = df['dictionary'].tolist()
list_2 = [dic.capitalize() for dic in my_list]
list_3 = [dic.lower() for dic in my_list]
my_list.extend(list_2)
my_list.extend(list_3)


for filename in os.listdir(path):
    if filename.endswith(".docx"):
        file = "C:\\Users\\files\\" + filename
        print(file)
        doc = Document(file)
        for para in doc.paragraphs:
            for phrase in my_list:
                #start = para.text.find(phrase)
                x = para.text
                starts = re.findall('\\b' + phrase + '\\b', x)
                #print(start)
                if len(starts)>0:
                    #print(starts)
                    #if start > -1 :
                    start = para.text.find(phrase)
                    pre = para.text[:start]
                    post = para.text[start+len(phrase):]
                    para.text = pre
                    para.add_run(phrase)
                    para.runs[1].font.highlight_color = WD_COLOR_INDEX.YELLOW
                    para.add_run(post)
          
        doc.save( file )

标签: pythonregexdocx

解决方案


我想我找到了问题所在。

在这里,您将没有任何格式的pre文本插入到段落中,这会覆盖之前在该部分中完成的任何格式:

pre = para.text[:start]
...
para.text = pre

这部分也发生了同样的post情况:

post = para.text[start + len(phrase):]
...
para.add_run(post)

它总是用纯文本覆盖上一次迭代中所做的任何突出显示。的text属性paragraph只给你一个string没有格式的。并从对象属性的文档中textparagraph

将文本分配给此属性会导致所有现有段落内容被替换为包含已分配文本的单个运行...保留段落级别的格式,例如样式。删除了所有运行级格式,例如粗体或斜体

如果您更改 中元素的顺序,您可以看到这一点my_list。只有最后一个元素会突出显示。我从

my_list = ['approximate', 'may', 'pending']

结果是突出显示的Pending. 然后我切换到

my_list = ['approximate', 'pending', 'may']

结果是突出显示的May. 我在这里指的是您示例中的最后一行。

编辑:这是一个修复它的尝试。

我已经换了

# List of words
df = pd.read_excel(input_file) 
my_list = df['dictionary'].tolist()
list_2 = [dic.capitalize() for dic in my_list]
list_3 = [dic.lower() for dic in my_list]
my_list.extend(list_2)
my_list.extend(list_3)

# List of words
df = pd.read_excel(input_file) 
my_list = df['dictionary'].tolist()

# Setup regex
patterns = [r'\b' + word + r'\b' for word in my_list]
re_highlight = re.compile('(' + '|'.join(p for p in patterns) + ')+',
                          re.IGNORECASE)

for filename in os.listdir(path):
    if filename.endswith(".docx"):
        file = "C:\\Users\\files\\" + filename
        print(file)
        doc = Document(file)
        for para in doc.paragraphs:
            for phrase in my_list:
                #start = para.text.find(phrase)
                x = para.text
                starts = re.findall('\\b' + phrase + '\\b', x)
                #print(start)
                if len(starts)>0:
                    #print(starts)
                    #if start > -1 :
                    start = para.text.find(phrase)
                    pre = para.text[:start]
                    post = para.text[start+len(phrase):]
                    para.text = pre
                    para.add_run(phrase)
                    para.runs[1].font.highlight_color = WD_COLOR_INDEX.YELLOW
                    para.add_run(post)
          
        doc.save( file )

for filename in os.listdir(path):
    if filename.endswith(".docx"):
        file = "C:\\Users\\files\\" + filename
        print(file)
        doc = Document(file)
        for para in doc.paragraphs:
            text = para.text
            if len(re_highlight.findall(text)) > 0:
                matches = re_highlight.finditer(text)
                para.text = ''
                p3 = 0
                for match in matches:
                    p1 = p3
                    p2, p3 = match.span()
                    para.add_run(text[p1:p2])
                    run = para.add_run(text[p2:p3])
                    run.font.highlight_color = WD_COLOR_INDEX.YELLOW
                para.add_run(text[p3:])
        doc.save(file)

它适用于您提供的示例。但我不是正则表达式专家,可能有更简洁的解决方案。


推荐阅读