Чтобы ваш сценарий только добавил цвет к дате, он должен быть один в цикле.
Рассмотрим этот пример:
from docx import Document
from docx.shared import Inches
from docx.enum.text import WD_COLOR_INDEX
document = Document()
document.add_heading('Document Title', 0)
p = document.add_paragraph('A plain paragraph having some ')
p.add_run('bold').bold = True
p.add_run(' 05-03-2018 ')
p.add_run('italic.').italic = True
document.save('demo.docx')
А затем:
doc = Document('demo.docx')
for p in doc.paragraphs:
for run in p.runs:
date1 = re.findall(r"[0-9]{2}-[0-9]{2}-(?!0000)[0-9]{4}", run.text)
if date1:
run.font.highlight_color = WD_COLOR_INDEX.YELLOW
doc.save('demo.docx')
Обновление: Может быть, это может вам помочь.Будет выполнен поиск строки в тексте абзаца.Если он найден, он сохранит прогоны в списке, удалит текст абзаца, а затем перестроит прогоны.Прогон с совпадением внутри перестраивается со специальным синтаксисом для раскраски даты.
from docx import Document
from docx.shared import Inches
from docx.enum.text import WD_COLOR_INDEX
document = Document()
document.add_heading('Document Title', 0)
p = document.add_paragraph('A plain paragraph having some ')
p.add_run('bold text. ').bold = True
p.add_run('Current date: 05-03-2018 ')
p.add_run('italic.').italic = True
document.save('demo.docx')
doc = Document('demo.docx')
pattern = r"[0-9]{2}-[0-9]{2}-(?!0000)[0-9]{4}"
for p in doc.paragraphs:
if re.findall(pattern, p.text):
runs = list(p.runs)
p.text = ''
for run in runs:
match = re.search(pattern, run.text)
if not match:
newrun = p.add_run(run.text)
if run.bold:
newrun.bold = True
if run.italic:
newrun.italic = True
else:
start, end = match.span()
p.add_run(run.text[0:start])
colored = p.add_run(run.text[start:end])
colored.font.highlight_color = WD_COLOR_INDEX.YELLOW
p.add_run(run.text[end:len(run.text)+1])
doc.save('demo.docx')