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 通过旧列创建新列?
在 Google BigQuery 中将字符串保存为正则表达式