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 | 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?
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í:
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:
Para usar el patrón de regex actualizado en la consulta, reemplace el patrón existente con el nuevo, de esta manera:
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ónSUBSTR
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: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.