【问题标题】:BigQuery regex lookbehind / lookahead workaround?BigQuery 正则表达式后向/前瞻解决方法?
【发布时间】:2021-04-22 03:34:37
【问题描述】:
用 BigQuery 做 ETL,我的目标是清理一些文本代码:
这些代码的标准语法是 ABC D123 或 ABCD D123(一组字母,后跟一个空格,然后是另一个字母,然后是一组数字)。
但是,有些数字输入的是 O(大写字母)而不是数字 0(零)。这些错误出现在数列的末尾:所以 ABC D56O 应该变成 ABC D560。
我尝试使用 regexp_replace() 使用后向断言,例如 (?<=[0-9])O。
但是,r2 library 似乎没有在后面处理 see this post from 2013 for reference。
那么有解决办法吗?
【问题讨论】:
标签:
regex
google-bigquery
【解决方案1】:
这些错误出现在数列的末尾
为什么不简单地将 O(大写字母)替换为 0(零),因为它位于代码末尾 - 如下例所示
#standardSQL
with `project.dataset.table` as (
select 'ABC D123' code union all
select 'ABCD D123' union all
select 'ABC D56O'
)
select code,
regexp_replace(code, r'O$', '0') as fixed_code
from `project.dataset.table`
有输出
如果O 可以在0 预期的任何位置找到 - 请在下面使用
#standardSQL
with `project.dataset.table` as (
select 'ABC D123' code union all
select 'ABCD D123' union all
select 'ABC D56O' union all
select 'ABC DO56' union all
select 'ABC D5O6'
)
select code,
regexp_extract(code, r'[a-zA-Z]+ [a-zA-Z]') ||
replace(regexp_extract(code, r'[a-zA-Z]+ [a-zA-Z](.+)'), 'O', '0') as fixed_code
from `project.dataset.table`
有输出