es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Eres un traductor de español que traduce documentos de TI. Traduce lo siguiente al español. [Eliminar notas entre corchetes, regex]

Entonces, tengo un documento de más de 300 páginas y quiero eliminar todas las notas que escribí, las cuales están encerradas entre “[(” y “)]”. Dado que a veces también anido varias notas, “[(blah [(blah [(blah) )] )]”, necesito asegurarme de no eliminar solo “[(blah [(blah [(blah)]”.

Para hacer eso, no estoy seguro de cuál es la forma más eficiente… y este es un trabajo grande. Se me ocurre que podría verificar si no hay dos “[(” consecutivos, con “.*” entre ellos, y simplemente eliminar los casos simples de “[(…)]”. Espero que haya una forma mejor que esta, sin embargo.

Creo que los dos códigos regex que utilizaría serían algo como ““/(?<=[[(])[\s\S](?=[(])/gi” y ““/(?![\s\S](?=[[([(]).<\/em>\/gi”. ¿Algo así? Lo siento, todavía estoy tratando de entender estas cosas.

Además, ¿puedo escribir un programa en Python para abrir un archivo de OpenOffice (odt) y editarlo? ¿El “open(r’C:\Users\Blah\Documents\Blah.odt’, ‘rw’).read()” funcionará también para eso, verdad?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para eliminar todas las notas encerradas entre “[( )” de un documento de más de 300 páginas, una forma eficiente podría ser utilizar expresiones regulares en Python. Aquí hay algunas sugerencias para hacerlo:

    1. Usa el módulo re en Python para buscar y reemplazar el patrón de “[( )” por una cadena vacía.
    import re
    
    with open('documento.odt', 'r+') as f:
        contenido = f.read()
        patron = r'\[\((.*?)\)\]'
        contenido_actualizado = re.sub(patron, '', contenido)
        f.seek(0)
        f.write(contenido_actualizado)
        f.truncate()
    

    El código anterior lee el contenido del documento, busca el patrón de “[( )” utilizando la expresión regular \[\((.*?)\)\], que hace coincidir cualquier cosa dentro de corchetes y paréntesis. Luego, la función re.sub() sustituye todas las coincidencias por una cadena vacía. Finalmente, el contenido actualizado se escribe de nuevo en el archivo.

    1. Usa una expresión regular recursiva para eliminar las notas anidadas encerradas entre “[( )” de un documento.
    import re
    
    with open('documento.odt', 'r+') as f:
        contenido = f.read()
        patron = r'\[\((?:[^()\[\]]+|(?R))*\)\]'
        contenido_actualizado = re.sub(patron, '', contenido)
        f.seek(0)
        f.write(contenido_actualizado)
        f.truncate()
    

    El código anterior utiliza la expresión regular r'\[\((?:[^()\[\]]+|(?R))*\)\]', que es una expresión regular recursiva que coincide con patrones anidados de “[( )” utilizando la subexpresión (?R). Esta expresión regular coincide con cualquier cosa dentro de la primera aparición de “[( )” y “)]”, incluso cuando están anidados. Luego, la función re.sub() reemplaza todas las coincidencias por una cadena vacía.

    Con respecto a la pregunta sobre cómo abrir un archivo OpenOffice (odt) y editarlo usando un programa Python, el código mencionado open(r'C:\Usuarios\Blah\Documentos\Blah.odt', 'rw').read() no funcionará. En su lugar, podemos utilizar la biblioteca python-uno para manipular archivos de OpenOffice.

    import uno
    
    # Crear una conexión con OpenOffice
    contexto_local = uno.getComponentContext()
    resolutor = contexto_local.ServiceManager.createInstanceWithContext(
        "com.sun.star.bridge.UnoUrlResolver", contexto_local)
    ctx = resolutor.resolve("uno:socket,host=localhost,port=2002;urp;StarOffice.ComponentContext")
    smgr = ctx.ServiceManager
    escritorio = smgr.createInstanceWithContext("com.sun.star.frame.Desktop", ctx)
    
    # Cargar el documento
    documento = escritorio.loadComponentFromURL("file:///ruta/al/documento.odt", "_blank", 0, ())
    texto = documento.getText()
    
    # Editar el contenido
    texto.setString(contenido_actualizado)
    
    # Guardar y cerrar el documento
    documento.storeToURL("file:///ruta/al/documento.odt", ())
    documento.close(True)
    

    El código anterior se conecta a una instancia de OpenOffice en ejecución en localhost y puerto 2002, carga el documento ubicado en “file:///ruta/al/documento.odt”, obtiene el objeto de texto del documento, establece el contenido actualizado en el objeto de texto, guarda y cierra el documento.

    Es importante tener en cuenta que para utilizar la biblioteca python-uno, debes tener instalado OpenOffice o LibreOffice en tu computadora.

Comments are closed.