REGEXP_SUBSTR 红移
Posted
技术标签:
【中文标题】REGEXP_SUBSTR 红移【英文标题】:REGEXP_SUBSTR Redshift 【发布时间】:2018-02-16 23:45:43 【问题描述】:我正在尝试从 postgresql 中的文本字符串中提取子字符串。文本字符串的列名是 short_description,我正在使用 REGEXP_SUBSTR 函数来定义一个正则表达式,它将只返回我想要的部分:
SELECT short_description,
REGEXP_SUBSTR(short_description,'\\[[^=[]*') AS space
FROM my_table
这将返回以下内容:
short_description space
----------------------------------------------------------------------------
[ABC12][1][ABCDEFG] ACB DEF [HIJ] | [ABC12]
我想拉的是以下内容:
short_description space
----------------------------------------------------------------------------
[ABC12][1][ABCDEFG] ACB DEF [HIJ] | [ABCDEFG]
有什么想法吗?
【问题讨论】:
【参考方案1】:您可以使用Regex character classes 来帮助进行这种匹配。在这里,我只寻找字母,用括号括起来,然后是一个空格。注意使用双反斜杠 \\
来转义文字括号和字符类的双括号 [[:a:]]
SELECT REGEXP_SUBSTR('[ABC12][1][ABCDEFG] ACB DEF [HIJ]','\\[[[:alpha:]]+\\] ');
regexp_substr
---------------
[ABCDEFG]
您还可以使用 SPLIT_PART 函数通过在右括号 ]
上拆分并选择第三个值来实现类似的效果。
SELECT SPLIT_PART('[ABC12][1][ABCDEFG] ACB DEF [HIJ]',']',3);
split_part
------------
[ABCDEFG
如果可能的话,我建议使用内置函数而不是 UDF。 UDF 在您需要时非常棒,但它们确实会导致性能损失。
【讨论】:
不确定性能但绝对使用这个而不是我的 UDF 版本! - 好答案!【参考方案2】:给你。 我找到了正确的正则表达式 https://txt2re.com
然后,我将它实现为 python redshift UDF
create or replace function f_regex (input_str varchar(max),regex_expression varchar(max))
returns VARCHAR(max)
stable
as $$
import re
rg = re.compile(regex_expression,re.IGNORECASE|re.DOTALL)
return rg.search(input_str).group(1)
$$ language plpythonu;
select f_regex('[ABC12][1][ABCDEFG] ACB DEF [HIJ] '::text,'.*?\\[.*?\\].*?\\[.*?\\](\\[.*?\\])'::text);
创建函数后,您可以在任何 redshift 选择中使用它。
所以,在你的情况下:
SELECT short_description,
f_regex(short_description::text,'.*?\\[.*?\\].*?\\[.*?\\](\\[.*?\\])'::text) AS space
FROM my_table
【讨论】:
以上是关于REGEXP_SUBSTR 红移的主要内容,如果未能解决你的问题,请参考以下文章
亚马逊 Redshift 的 REGEXP_SUBSTR 中的“匹配但排除”
regexp_replace 和 regexp_substr 变量的比较