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.

La función regexp_extract() de Spark falla porque el recuento de grupos de la expresión regular es 0, pero el índice de grupo especificado es 1.

Me gustaría extraer la última parte de la cadena (después de la última barra inclinada hacia adelante).
Cuando uso el siguiente código, falla con el siguiente error:

library(sparklyr)
library(tidyverse)

sc <- spark_connect(method = "databricks")

tibble(my_string = c("aaa/bbb/ccc", "ddd/eee/fff", "ggg/hhh/iii")) %>%
  copy_to(sc, ., "test_regexp_extract", overwrite = TRUE) %>%
  mutate(my_result = regexp_extract(my_string, "(?<=/)[^/]*$")) %>%
  count(my_result)

show_query() muestra la siguiente consulta:

<sql>
SELECT `my_result`, COUNT(*) AS `n`
FROM (SELECT `my_string`, regexp_extract(`my_string`, "(?<=/)[^/]*$") AS `my_result`
FROM `test_regexp_extract`) `q01`
GROUP BY `my_result`

Sospecho que podría ser el problema del carácter de barra inclinada hacia adelante en la expresión regular. Intenté escaparlo con una barra invertida.
Otra idea es que por alguna razón falla cuando no se encuentra coincidencia. Según la documentación de Spark debería funcionar:

Si la expresión regular no coincide, o el grupo especificado no coincide, se devuelve una cadena vacía.

¿Alguna idea por qué falla? En R, el mismo código funciona bien.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El problema parece estar en el patrón regex (?<=/)[^/]*$, que está diseñado para coincidir con la última parte de la cadena después de la última barra diagonal. El mensaje de error Regex group count is 0, but the specified group index is 1 sugiere que el patrón regex no está coincidiendo con ningún grupo, pero el código intenta extraer el primer grupo coincidente.

    Una posible solución es modificar el patrón regex para usar un grupo de captura alrededor de la coincidencia deseada, como /(?P<last>[^/]+)$. Esto capturará la última parte de la cadena como un grupo con nombre ‘last’, que se puede extraer utilizando la función regexp_extract. El código actualizado podría lucir así:

    “`{r}
    library(sparklyr)
    library(tidyverse)

    sc <- spark_connect(method = “databricks”)

    tibble(my_string = c(“aaa/bbb/ccc”, “ddd/eee/fff”, “ggg/hhh/iii”)) %>%
    copy_to(sc, ., “test_regexp_extract”, overwrite = TRUE) %>%
    mutate(my_result = regexp_extract(my_string, “/(?P[^/]+)$”, 1)) %>%
    count(my_result)


    La consulta generada por `show_query()` debería verse así:


    SELECT my_result, COUNT(*) AS n
    FROM (SELECT my_string, regexp_extract(my_string, ‘/(?P[^/]+)$’, 1) AS my_result
    FROM test_regexp_extract) q01
    GROUP BY my_result
    “`

    Esto debería extraer la parte deseada de la cadena y contar las ocurrencias de cada valor.

    No está claro por qué el patrón regex original no funcionó, pero una posibilidad es que el motor regex de Spark lo interpretara de manera diferente al motor regex de R, lo que llevó a un comportamiento diferente.

Comments are closed.