Bigquery SQL Regex - 字符串的开始/结束或不跟随/跟随任何字母

Posted

技术标签:

【中文标题】Bigquery SQL Regex - 字符串的开始/结束或不跟随/跟随任何字母【英文标题】:Bigquery SQL Regex - Either start/end of string or not followed by/following any alphabet 【发布时间】:2021-05-04 03:53:16 【问题描述】:

我想查找一个字符串(已经小写)是否包含一个确切的单词。它可以在字符串中的任何位置。例如,假设这个词是pot

我最初使用过

regexp_contains(lower(string), "^.*[^a-z]pot[^a-z].*$")

但这无法捕获 pot 出现在字符串开头/结尾的情况。据我了解,[^a-z] 需要匹配字母以外的其他内容,并且对于开始/结束情况,它无法找到任何内容。

所以,我添加了* 以确保即使没有字母也可以。

regexp_contains(lower(string), "^.*[^a-z]*pot[^a-z]*.*$")

但它匹配 pot 是另一个更大单词的一部分的情况,例如。 honeypot

我不认为这个问题仅限于 Bigquery SQL 的regexp_contains

【问题讨论】:

感谢您的努力,您能否发布一些输入和预期输出示例以使问题更清晰,谢谢。 试试这个REGEXP_CONTAINS(value, r"\bpot\b") 【参考方案1】:

考虑下面的例子

#standardSQL
with `project.dataset.table` as (
  select 'pot asdf' sentence union all 
  select 'rtui pot' union all 
  select 'rtui pot dfgrert' union all 
  select 'sdpot potdf lkpotij' union all 
  select 'fjkhgsiejur sldkkr'
)
select sentence
from `project.dataset.table`
where regexp_contains(lower(sentence), r'\bpot\b')

【讨论】:

感谢您的解决方案。它使用 Bigquery UI 工作。但是,当我使用 pands.read_gbq 从 jupyter 笔记本向 BQ 传递相同的查询时,它不起作用。我正在使用if(regexp_contains(lower(string), r'(\blot\b|\bcot\b)'), 1, 0) is_pot_or_cot,在 UI 中,有些行有 1,有些有 0,但从 jupyter noteboook 获取的数据帧对于列 is_pot_or_cot 都是 0。 我应该如何从 python 客户端在 bigquery SQL 中传递上述正则表达式模式? @米哈伊尔【参考方案2】:
regexp_contains(lower(string), "^.*[^a-z]pot[^a-z].*$|^pot[^a-z].*$|^.*[^a-z]pot$|^pot$")

【讨论】:

以上是关于Bigquery SQL Regex - 字符串的开始/结束或不跟随/跟随任何字母的主要内容,如果未能解决你的问题,请参考以下文章

如何在 BigQuery 中使用 REGEX 通过旧列创建新列?

正则表达式修剪字符串 sql 的部分

BigQuery - 增加特定表的处理时间

在 Google BigQuery 中将字符串保存为正则表达式

如何在没有环视的情况下在 RegEx 中捕获“搜索”而不是“/搜索”?

如何在 BigQuery 的标准 SQL 中解析具有不同日期字符串的列中的值