python - 使用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 )
解决方案
我想我找到了问题所在。
在这里,您将没有任何格式的纯pre
文本插入到段落中,这会覆盖之前在该部分中完成的任何格式:
pre = para.text[:start]
...
para.text = pre
这部分也发生了同样的post
情况:
post = para.text[start + len(phrase):]
...
para.add_run(post)
它总是用纯文本覆盖上一次迭代中所做的任何突出显示。的text
属性paragraph
只给你一个string
没有格式的。并从对象属性的文档中text
paragraph
:
将文本分配给此属性会导致所有现有段落内容被替换为包含已分配文本的单个运行...保留段落级别的格式,例如样式。删除了所有运行级格式,例如粗体或斜体。
如果您更改 中元素的顺序,您可以看到这一点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)
它适用于您提供的示例。但我不是正则表达式专家,可能有更简洁的解决方案。
推荐阅读
- javascript - 如果选择特定单选按钮,则显示输入框
- java - 从命令行运行 Scala 函数
- r - 编织到 PDF 时如何更改 rmarkdown 块背景颜色
- wordpress - 联系表格 7:任何防病毒集成?
- pine-script - pinescript中是否有process_orders_on_open之类的东西?
- amazon-s3 - AWS Cloud S3 并使用 Tableau 检索文件
- typescript - 根据主ID和子ID合并数组内的对象
- php - PHP - 防止在具有父对象的对象中循环引用
- javascript - 通过 DOM 设置 src 与比较 src 值
- html - CSS悬停被强制 - 应用于孩子