Bigquery中具有字符串值的REGEXP_EXTRACT

问题描述

我想提取一列中的单词,该列的值如下所示:'p-fr-youtube-car'。并且它们都应该提取到自己的列中。

输入

p-fr-youtube-car

期望的输出

Country = fr
Channel = youtube
Item = car

我在下面尝试提取一个单词,但无法弄清楚其余单词。哪种RegEx可以从此输入中获得所需的输出?而且如何使不区分大小写的fr和FR相同。

REGEXP_EXTRACT_ALL(CampaignName,r"^p-([a-z]*)") AS Country

解决方法

您可以使用命名组。

正则表达式示例:

library(tidyverse)
data1 <- tibble(Year = 2005:2008,Count = c(3000,4000,5000,6000))
data1growth <- data1 %>%
    mutate(Growth = Count - lag(Count))

# Period as string
data1growth %>%
    mutate(Period = paste0(Year,"-",Year-1))
#> # A tibble: 4 x 4
#>    Year Count Growth Period   
#>   <int> <dbl>  <dbl> <chr>    
#> 1  2005  3000     NA 2005-2004
#> 2  2006  4000   1000 2006-2005
#> 3  2007  5000   1000 2007-2006
#> 4  2008  6000   1000 2008-2007

# Period as string (don't include NA Growth)
data1growth %>%
    mutate(Period = ifelse(is.na(Growth),NA,paste0(Year,Year-1)))
#> # A tibble: 4 x 4
#>    Year Count Growth Period   
#>   <int> <dbl>  <dbl> <chr>    
#> 1  2005  3000     NA <NA>     
#> 2  2006  4000   1000 2006-2005
#> 3  2007  5000   1000 2007-2006
#> 4  2008  6000   1000 2008-2007

https://regex101.com/r/fKoBIn/3

enter image description here

,

您可以使用[^-]+来匹配连字符之间的部分,并且仅捕获需要提取的内容。

要获取类似youtube的字符串,可以使用

REGEXP_EXTRACT_ALL(CampaignName,r'^p-[^-]+-([^-]+)')

要获取类似car的字符串,可以使用

REGEXP_EXTRACT_ALL(CampaignName,r'^p-[^-]+-[^-]+-([^-]+)')

因此,[^-]+匹配除-以外的一个或多个字符,并且([^-]+)是用捕获组包装的相同模式,捕获组的内容实际上返回了REGEXP_EXTRACT

,

以下是用于BigQuery标准SQL

在像您这样的情况下,我建议使用SPLIT

#standardSQL
SELECT CampaignName,parts[SAFE_OFFSET(1)] AS Country,parts[SAFE_OFFSET(2)] AS Channel,parts[SAFE_OFFSET(3)] AS Item
FROM `project.dataset.table`,UNNEST([STRUCT(SPLIT(CampaignName,'-') AS parts)])   

如果要应用于您的问题的样本数据-输出为

Row CampaignName        Country     Channel     Item     
1   p-fr-youtube-car    fr          youtube     car     

同时,如果出于某些原因需要使用Regexp,则可以在下面使用

#standardSQL
SELECT CampaignName,UNNEST([STRUCT(REGEXP_EXTRACT_ALL(CampaignName,r'(?:^|-)([^-]*)') AS parts)])