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.

Cómo dividir una cadena utilizando expresiones regulares?

Estoy tratando de dividir el contenido del anuncio con cada carácter “””, pero no sé por qué no puedo ir más allá de la palabra número 9 de la división (splits[SAFE_OFFSET(8)] AS objetivo).

Esta es la consulta que estoy utilizando:

SELECT
    ad_content,
    splits[SAFE_OFFSET(0)] AS country,
    splits[SAFE_OFFSET(1)] AS product,
    splits[SAFE_OFFSET(2)] AS budget,
    splits[SAFE_OFFSET(3)] AS source,
    splits[SAFE_OFFSET(4)] AS campaign,
    splits[SAFE_OFFSET(5)] AS audience,
    splits[SAFE_OFFSET(6)] AS route_type,
    splits[SAFE_OFFSET(7)] AS business,
    splits[SAFE_OFFSET(8)] AS objective,
    splits[SAFE_OFFSET(9)] AS format,
    splits[SAFE_OFFSET(10)] AS nnn,
    splits[SAFE_OFFSET(11)] AS date
FROM (
  SELECT
    AD_CONTENT,
    SPLIT(REGEXP_REPLACE(
            AD_CONTENT,
            r'([^_]+)_([^_]+)_([^_]+)_([^_]+)_([^_]+)_([^_]+)_([^_]+)_([^_]+)_([^_]+)_([^_]+)_([^_]+)_([^_]+)_(.+)'),
          '|') AS splits
  FROM ga_digital_marketing
)

Por ejemplo, ad_content = us_latam_perf_facebook_black-friday_bbdd-push_SCL-CCP_domestic_conversion_push_all_20210906

Y estos son los resultados utilizando la consulta anterior:

ad_content country product budget source campaign audience route_type business objective format nnn date
us_latam_perf_facebook_black-friday_bbdd-push_SCL-CCP_domestic_conversion_push_all_20210906 us latam perf facebook black-friday bbdd-push SCL-CCP domestic conversion us0 us1 us2

Como se puede ver arriba, la columna format (splits[SAFE_OFFSET(9)] AS format) no está dando los resultados correctamente.

Creo que el problema está aquí: r'([^_]+)_([^_]+)_([^_]+)_([^_]+)_([^_]+)_([^_]+)_([^_]+)_([^_]+)_([^_]+)_([^_]+)_([^_]+)_([^_]+)_(.+)') porque tal vez el número 0 de |\10 no se reconoce como un número sino como una cadena. Y por eso obtengo como resultado us0, us1 y us2.

¿Hay alguna solución para esta limitación?

¿Hay otra forma de dividir el ejemplo de ad_content?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Posible Solución para la Limitación en la División de Ad_Content con SQL y Regex

    Una posible solución para la limitación en la división del ad_content con SQL y regex es cambiar el patrón de regex utilizando una aserción lookahead para dividir la cadena en cada aparición de “_” excepto en la última. El patrón de regex actualizado podría verse así:

    ([^_]+)(?=_((?:[^_]+_){8}[^_]+$))
    

    Este patrón hace coincidir cualquier secuencia de uno o más caracteres que no sean guiones bajos, seguido de un carácter guión bajo y ocho secuencias más de caracteres que no son guiones bajos, seguido de un carácter guión bajo y uno o más caracteres que no son guiones bajos y que están al final de la cadena.

    Con este patrón actualizado, las divisiones serían:

    ad_content country product budget source campaign audience route_type business objective format nnn date
    us_latam_perf_facebook_black-friday_bbdd-push_SCL-CCP_domestic_conversion_push_all_20210906 us latam perf facebook black-friday bbdd-push SCL-CCP domestic conversion_push_all_20210906 20210906

    Para usar el patrón de regex actualizado en la consulta, reemplace el patrón existente con el nuevo, de esta manera:

    SELECT
        ad_content,
        splits[SAFE_OFFSET(0)] AS country,
        splits[SAFE_OFFSET(1)] AS product,
        splits[SAFE_OFFSET(2)] AS budget,
        splits[SAFE_OFFSET(3)] AS source,
        splits[SAFE_OFFSET(4)] AS campaign,
        splits[SAFE_OFFSET(5)] AS audience,
        splits[SAFE_OFFSET(6)] AS route_type,
        splits[SAFE_OFFSET(7)] AS business,
        splits[SAFE_OFFSET(8)] AS objective,
        SUBSTR(splits[SAFE_OFFSET(9)], 1, LENGTH(splits[SAFE_OFFSET(9)])-8) AS format,
        splits[SAFE_OFFSET(10)] AS nnn,
        splits[SAFE_OFFSET(11)] AS date
    FROM
        (
            SELECT
                AD_CONTENT,
                SPLIT(
                    REGEXP_REPLACE(
                        AD_CONTENT,
                        r'([^_]+)(?=_((?:[^_]+_){8}[^_]+$))',
                        r'\1|'),
                    '|') AS splits
            FROM
                ga_digital_marketing
        )
    

    Con esta consulta actualizada, la columna de formato (splits[SAFE_OFFSET(9)] AS format) ahora se divide correctamente y el texto adicional al final se elimina mediante el uso de la función SUBSTR para extraer una subcadena que excluye los últimos ocho caracteres.

    Forma Alternativa de Dividir Ad_Content utilizando Google BigQuery

    Otra forma de dividir el ad_content es utilizar la función SPLIT en Google BigQuery mediante la creación de una función definida por el usuario (UDF) que divida la cadena en cada aparición de “_”. Aquí tienes un ejemplo de cómo crear y utilizar una UDF para dividir el ad_content:

    CREATE TEMP FUNCTION SPLIT_AD_CONTENT(ad_content STRING)
      RETURNS ARRAY<string>
      LANGUAGE js AS """
      return ad_content.split('_');
    """;
    
    SELECT
        ad_content,
        SPLIT_AD_CONTENT(ad_content)[SAFE_OFFSET(0)] AS country,
        SPLIT_AD_CONTENT(ad_content)[SAFE_OFFSET(1)] AS product,
        SPLIT_AD_CONTENT(ad_content)[SAFE_OFFSET(2)] AS budget,
        SPLIT_AD_CONTENT(ad_content)[SAFE_OFFSET(3)] AS source,
        SPLIT_AD_CONTENT(ad_content)[SAFE_OFFSET(4)] AS campaign,
        SPLIT_AD_CONTENT(ad_content)[SAFE_OFFSET(5)] AS audience,
        SPLIT_AD_CONTENT(ad_content)[SAFE_OFFSET(6)] AS route_type,
        SPLIT_AD_CONTENT(ad_content)[SAFE_OFFSET(7)] AS business,
        SPLIT_AD_CONTENT(ad_content)[SAFE_OFFSET(8)] AS objective,
        SPLIT_AD_CONTENT(ad_content)[SAFE_OFFSET(9)] AS format,
        SPLIT_AD_CONTENT(ad_content)[SAFE_OFFSET(10)] AS nnn,
        SPLIT_AD_CONTENT(ad_content)[SAFE_OFFSET(11)] AS date
    FROM
        ga_digital_marketing
    

    Con esta UDF, la columna de ad_content se divide en un array de cadenas en cada aparición de “_”, y los elementos individuales del array se pueden acceder en la declaración SELECT utilizando la función SAFE_OFFSET.

    Este enfoque alternativo es más sencillo, más fácil de leer y menos propenso a errores que el uso de un patrón de regex complejo. Además, es más flexible, ya que se puede adaptar fácilmente a diferentes formatos de ad_content modificando la UDF.

Comments are closed.