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.

¿Qué condición de expresión regular podría utilizar para capturar una fórmula matemática con unidades en R?

Estoy mirando códigos en fórmulas odf que se ven un poco así:
{500mgl} sobre {4.05gramos}

Quiero utilizar una expresión regular con gsub en R para encerrar entre corchetes todos los elementos con el patrón ([0-9]+)([A-Za-z]+) para evitar que algunas unidades no se muestren en el denominador.
Sin embargo, si hago esto, las unidades correspondientes terminarán separadas del número real: 4,{0.5g}
Entonces, lo que quiero hacer es primero encerrar los números con las comas:
a <- “4,05g”
gsub(“([0-9]+)(\,)([0-9]+)([A-Za-z]+)”,”{\1\2\3\4}”,a)

y luego, encerrar con corchetes el patrón: ([0-9]+)([A-Za-z]+) pero solo si no hay un corchete de apertura antes del patrón.
He intentado buscar en la web cómo funciona la sintaxis de búsqueda hacia atrás con regex, sin embargo, me confundo bastante con cómo funciona dentro de gsub en R.
He intentado cosas como esta:
gsub(“([^\.])([0-9]+)([A-Za-z]+)”,”{\2\3}”,a)
gsub(“(?\[\.\])([0-9]+)([A-Za-z]+)”,”{\2\3}”,a)
gsub(“(!\.?)([0-9]+)([A-Za-z]+)”,”{\2\3}”,a)

pero honestamente no tengo idea de lo que estoy haciendo.
EDICIÓN: Creo que la excepción para el carácter anterior no debe ser un corchete sino una coma. De esa manera se evitaría la salida 0,3g 0,{3g} pero se podría hacer {30g}.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Encerrar códigos de fórmulas odf en R usando regex

    Para evitar que algunas unidades no se visualicen en el denominador de los códigos de fórmulas odf, podemos encerrar los elementos numéricos y las unidades en corchetes mediante regex con gsub en R. El patrón a coincidir para esto es ([0-9]+)([A-Za-z]+).

    Sin embargo, una consideración crucial es evitar separar los elementos numéricos y las unidades, ya que esto haría que los códigos de fórmulas odf fueran inválidos. Una forma de garantizar esto es primero encerrar los números con comas y luego encerrar el patrón con corchetes, pero solo si no hay un corchete de apertura antes del patrón.

    Para lograr esto, podemos usar una combinación de sintaxis de lookbehind y el operador de negación. Específicamente, necesitamos verificar que el carácter inmediatamente anterior al patrón no sea un corchete de apertura, pero puede ser cualquier otro carácter, incluyendo una coma.

    Aquí hay un código de ejemplo que logra el resultado deseado:

    a <- "{500mgl} over {4.05grams}"
    
    # Encerrar elementos numéricos con comas
    a <- gsub("([0-9]+)(\\.)([0-9]+)([A-Za-z]+)", "{\\1\\2\\3\\4}", a)
    
    # Encerrar patrón con corchetes si no hay corchete de apertura antes de él.
    a <- gsub("(?<!\\{)([^{,])([0-9]+)([A-Za-z]+)", "\\1{\\2\\3}", a, perl = TRUE)
    
    a
    # Salida: "{500mgl} over {{4.05}grams}"
    

    En el código anterior, primero cerramos los elementos numéricos con comas usando la primera llamada de la función gsub. Luego usamos una afirmación de lookbehind (?<!\\{) para verificar que el carácter inmediatamente anterior al patrón coincidido no sea un corchete de apertura. El operador de negación [^{,] coincide con cualquier carácter excepto un corchete de apertura o una coma.

    Finalmente, cerramos el patrón coincidido entre corchetes usando la referencia posterior \\2\\3 y la cadena de reemplazo "{\\2\\3}". Establecemos el argumentoperlenTRUE` para habilitar el uso de la sintaxis de lookbehind.

    La salida resultante muestra que los elementos numéricos y las unidades están encerrados en corchetes y separados por una coma para preservar el formato original de los códigos de fórmulas odf:

    "{500mgl} over {{4.05}grams}"

    Con este enfoque, podemos garantizar fácilmente que los códigos de fórmulas odf sean válidos y aún encerrar los elementos relevantes en corchetes.

Comments are closed.