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.

R stringr regex para extraer caracteres entre corchetes

Estoy tratando de utilizar regex en R para extraer la cadena completa dentro de corchetes, donde los corchetes contienen una palabra clave:

library(stringr)
test <- "asdf asiodjfojewl kjwnkjwnefkjnkf [asdf] fasdfads fewrw [keyword<1] keyword [keyword>1]"

Debería devolver:

keyword<1 # está bien si también devuelve [keyword<1] con los corchetes
keyword>1

Mi intento devuelve todas las letras individualmente y excluye el número de los corchetes.

# mi intento
str_extract_all(test, regex("\\[keyword<.*?\\]"))
[[1]]
 [1] "[k" "e"  "y"  "w"  "o"  "r"  "d"  "<"  "1"  "[k" "e" 
[12] "y"  "w"  "o"  "r"  "d"  ">"  "1"  "]" 
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para extraer la cadena completa dentro de corchetes donde los corchetes contienen la palabra clave, puedes usar las afirmaciones de lookbehind y lookahead positivas en una expresión regular. Aquí tienes el código que debería funcionar:

    str_extract_all(test, regex("(?<=\\[)(?=.*keyword).*?(?=\\])"))
    

    Desglosemos este patrón de expresión regular:

    • (?<=\\[): Esta es una afirmación de lookbehind positiva que busca el corchete de apertura “[” pero no lo incluye en la coincidencia.
    • (?=.*keyword): Esta es una afirmación de lookahead positiva que verifica si la palabra “keyword” existe en cualquier parte dentro de los corchetes.
    • .*?: Esta expresión no codiciosa coincide con cualquier caracter (excepto nueva línea) cero o más veces, hasta la primera coincidencia de la parte siguiente del patrón.
    • (?=\\]): Esta es una afirmación de lookahead positiva que busca el corchete de cierre “]”, pero no lo incluye en la coincidencia.

    Al combinar estas afirmaciones y expresiones, podemos extraer las cadenas deseadas. La salida del código anterior sería:

    [[1]]
    [1] "[asdf]"       "[keyword<1]"  "[keyword>1]"
    

    Ten en cuenta que esto incluye los corchetes alrededor de las palabras clave. Si quieres excluirlos, puedes modificar el patrón de la siguiente manera:

    str_extract_all(test, regex("(?<=\\[)(?=.*keyword)(.*?)(?=\\])"))
    

    Esto solo coincidirá con el texto dentro de los corchetes, sin incluir los corchetes en sí:

    [[1]]
    [1] "asdf"      "keyword<1" "keyword>1"
    

Comments are closed.