问题描述
我想提取一列中的单词,该列的值如下所示:'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
,您可以使用[^-]+
来匹配连字符之间的部分,并且仅捕获需要提取的内容。
要获取类似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)])