【问题标题】:REGEXP_EXTRACT with String Value in BigqueryBigquery 中带有字符串值的 REGEXP_EXTRACT
【发布时间】:2023-03-28 11:02:01
【问题描述】:

我想提取列中的单词,列值如下所示:'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

【问题讨论】:

  • 您可以使用([^-]+) 来匹配连字符之间的部分。要获取youtube^p-[^-]+-([^-]+) 和获取car,请使用^p-[^-]+-[^-]+-([^-]+)
  • 你的意思是这样吗? REGEXP_EXTRACT_ALL(CampaignName, r'(?i)^p-[^-]+-([^-]+)([az]*)') AS Channel,我得到错误:传递给提取函数的正则表达式不能有超过 1 个捕获组
  • 我写了确切的模式,无需干预它们。 REGEXP_EXTRACT_ALL(CampaignName, r'^p-[^-]+-([^-]+)')REGEXP_EXTRACT_ALL(CampaignName, r'^p-[^-]+-[^-]+-([^-]+)')单独使用
  • 啊,好极了,现在我明白了。谢谢你。这对我有用!

标签: regex google-bigquery extract regexp-replace


【解决方案1】:

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

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

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

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

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

因此,[^-]+ 匹配除 - 之外的一个或多个字符,([^-]+) 是用捕获组包裹的相同模式,其内容 REGEXP_EXTRACT 实际上作为结果返回。

【讨论】:

    【解决方案2】:

    您可以使用命名组。

    正则表达式示例:

    p-(?P<Country>[a-z]*)\-(?P<Channel>[a-z]*)\-(?P<Item>[a-z]*)$
    

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

    【讨论】:

    • @WiktorStribiżew 你说得对,我已经将正则表达式和链接编辑为有效的 Golang 正则表达式。
    • 我似乎无法让它在 bigquery 中工作,不确定是否受支持,因为我认为我需要添加 As Contry 来创建列,例如。我收到错误“正则表达式通过提取函数中的捕获组不得超过 1 个”当我添加 'REGEXP_EXTRACT_ALL(CampaignName, r'^p-(?P[az]*)\-(?P[az]*)\ -(?P[az]*)$') 作为测试,'
    【解决方案3】:

    以下是 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     
    

    同时,如果由于某种原因你需要使用正则表达式 - 你可以在下面使用

    #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(REGEXP_EXTRACT_ALL(CampaignName, r'(?:^|-)([^-]*)') AS parts)])
    

    【讨论】:

      猜你喜欢
      • 2023-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多