Te doy la bienvenida a nuestra comunidad, en este sitio hallarás la solucíon que necesitas.
Solución:
La versión actual de python-docx no tiene un search()
función o una replace()
función. Estos se solicitan con bastante frecuencia, pero una implementación para el caso general es bastante complicada y aún no ha llegado a la cima de la cartera de pedidos.
Sin embargo, varias personas han tenido éxito, haciendo lo que necesitan, utilizando las instalaciones ya presentes. Aquí hay un ejemplo. Por cierto, no tiene nada que ver con las secciones 🙂
for paragraph in document.paragraphs:
if 'sea' in paragraph.text:
print paragraph.text
paragraph.text = 'new text containing ocean'
Para buscar también en tablas, necesitaría usar algo como:
for table in document.tables:
for row in table.rows:
for cell in row.cells:
for paragraph in cell.paragraphs:
if 'sea' in paragraph.text:
paragraph.text = paragraph.text.replace("sea", "ocean")
Si sigue este camino, probablemente descubrirá con bastante rapidez cuáles son las complejidades. Si reemplaza todo el texto de un párrafo, eso eliminará cualquier formato de nivel de carácter, como una palabra o frase en negrita o cursiva.
Por cierto, el código de la respuesta de @wnnmaw es para la versión heredada de python-docx y no funcionará en absoluto con versiones posteriores a la 0.3.0.
Necesitaba algo para reemplazar las expresiones regulares en docx. Tomé la respuesta de Scanny. Para manejar el estilo, he usado la respuesta de: Python docx Reemplazar string en el párrafo manteniendo el estilo llamado recursivo agregado para manejar tablas anidadas. y se me ocurrió algo como esto:
import re
from docx import Document
def docx_replace_regex(doc_obj, regex , replace):
for p in doc_obj.paragraphs:
if regex.search(p.text):
inline = p.runs
# Loop added to work with runs (strings with same style)
for i in range(len(inline)):
if regex.search(inline[i].text):
text = regex.sub(replace, inline[i].text)
inline[i].text = text
for table in doc_obj.tables:
for row in table.rows:
for cell in row.cells:
docx_replace_regex(cell, regex , replace)
regex1 = re.compile(r"your regex")
replace1 = r"your replace string"
filename = "test.docx"
doc = Document(filename)
docx_replace_regex(doc, regex1 , replace1)
doc.save('result1.docx')
Para iterar sobre el diccionario:
for word, replacement in dictionary.items():
word_re=re.compile(word)
docx_replace_regex(doc, word_re , replacement)
Tenga en cuenta que esta solución reemplazará la expresión regular solo si toda la expresión regular tiene el mismo estilo en el documento.
Además, si el texto se edita después de guardar el mismo estilo, el texto podría estar en ejecuciones separadas. Por ejemplo, si abre un documento que tiene “testabcd” string y lo cambia a “test1abcd” y lo guarda, incluso si es del mismo estilo, hay 3 ejecuciones separadas “test”, “1” y “abcd”, en este caso, el reemplazo de test1 no funcionará.
Esto es para realizar un seguimiento de los cambios en el documento. Para marcarlo en una sola ejecución, en Word debe ir a “Opciones”, “Centro de confianza” y en “Opciones de privacidad” desmarque “Almacenar números aleatorios para mejorar la precisión de la combinación” y guarde el documento.
Recibí mucha ayuda de las respuestas anteriores, pero para mí, el siguiente código funciona como lo haría la función simple de buscar y reemplazar en Word. Espero que esto ayude.
#!pip install python-docx
#start from here if python-docx is installed
from docx import Document
#open the document
doc=Document('./test.docx')
Dictionary = "sea": "ocean", "find_this_text":"new_text"
for i in Dictionary:
for p in doc.paragraphs:
if p.text.find(i)>=0:
p.text=p.text.replace(i,Dictionary[i])
#save changed document
doc.save('./test.docx')
La solución anterior tiene limitaciones. 1) El párrafo que contiene “buscar_este_texto” se convertirá en texto sin formato sin ningún formato, 2) los controles de contexto que están en el mismo párrafo con “buscar_este_texto” se eliminarán y 3) “buscar_este_texto” en controles de contexto o tablas no ser cambiado.
Si posees algún recelo y forma de afinar nuestro crónica puedes dejar una reseña y con gusto lo ojearemos.