【问题标题】: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`
    

    有输出

    【讨论】:

      猜你喜欢
      • 2015-09-13
      • 2013-06-10
      • 1970-01-01
      • 2021-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多