使用 regexp_extract 从 BigQuery 中的字符串中提取
Extract from string in BigQuery using regexp_extract
我在 BigQuery 中有一个很长的字符串,我需要从中提取一些数据。
部分字符串如下所示:
... source: "agent" resolved_query: "hi" score: 0.61254 parameters ...
我想提取出 agent
、hi
和 0.61254
等数据。
我正在尝试使用 regexp_extract,但我无法使正则表达式正常工作:
select
regexp_extract([col],r'score: [0-9]*\.[0-9]+') as score,
regexp_extract([col],r'source: [^"]*') as source
from [table]
正则表达式应该是什么才能得到 agent
或 0.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 需要提取 - 您不需要为每个属性克隆代码行 - 您只需添加另一个最后一行列表中的值 - 整个代码始终相同
我在 BigQuery 中有一个很长的字符串,我需要从中提取一些数据。
部分字符串如下所示:
... source: "agent" resolved_query: "hi" score: 0.61254 parameters ...
我想提取出 agent
、hi
和 0.61254
等数据。
我正在尝试使用 regexp_extract,但我无法使正则表达式正常工作:
select
regexp_extract([col],r'score: [0-9]*\.[0-9]+') as score,
regexp_extract([col],r'source: [^"]*') as source
from [table]
正则表达式应该是什么才能得到 agent
或 0.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 需要提取 - 您不需要为每个属性克隆代码行 - 您只需添加另一个最后一行列表中的值 - 整个代码始终相同