使用 regexp_extract 从 BigQuery 中的字符串中提取

Extract from string in BigQuery using regexp_extract

我在 BigQuery 中有一个很长的字符串,我需要从中提取一些数据。

部分字符串如下所示:

... source: "agent" resolved_query: "hi" score: 0.61254 parameters ...

我想提取出 agenthi0.61254 等数据。

我正在尝试使用 regexp_extract,但我无法使正则表达式正常工作:

select
regexp_extract([col],r'score: [0-9]*\.[0-9]+') as score,
regexp_extract([col],r'source: [^"]*') as source
from [table]

正则表达式应该是什么才能得到 agent0.61254 而没有字段名称和引号?

提前致谢。

您可以使用

select
regexp_extract([col],r'score:\s*(\d*\.?\d+)') as score,
regexp_extract([col],r'resolved_query:\s*"([^"]*)"') as resolved_query,
regexp_extract([col],r'source:\s*"([^"]*)"') as source
from [table]

这里,

  • score:\s*(\d*\.?\d+) 匹配 score: 字符串,然后是任何零个或多个空格,然后是一个 ID=1 的捕获组,它捕获零个或多个数字,一个可选的 .然后一位或多位数字
  • resolved_query:\s*"([^"]*)" 匹配 resolved_query: 字符串,零个或多个空格,",然后将 " 以外的任何零个或多个字符捕获到第 1 组中,然后匹配一个 " 字符
  • source:\s*"([^"]*)" 匹配 source: 字符串,零个或多个空格,",然后将 " 以外的任何零个或多个字符捕获到第 1 组中,然后匹配一个 " 个字符。

我喜欢不平凡的方法——低于其中一种方法——

select * except(col) from (
  select col, split(kv, ': ')[offset(0)] key,
    trim(split(kv, ': ')[offset(1)], '"') value,
  from your_table,
  unnest(regexp_extract_all(col, r'\w+: "?[\w.]+"?')) kv
)
pivot (min(value) for key in ('source', 'resolved_query', 'score'))     

如果应用于您问题中的样本数据

with your_table as (
  select '...  source: "agent"  resolved_query: "hi"  score: 0.61254  parameters ... ' col union all
  select '...  source: "agent2"  resolved_query: "hello"  score: 0.12345  parameters ... ' col 
)         

输出是

您可能已经注意到,这种方法的好处是显而易见的 - 如果您有更多 fields/attributes 需要提取 - 您不需要为每个属性克隆代码行 - 您只需添加另一个最后一行列表中的值 - 整个代码始终相同