我正在尝试从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]
有什么想法吗?
答案 0 :(得分:0)
你走了。 我找到了正确的正则表达式使用 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);
创建该功能后,您可以在任何红移选项中使用它。
所以,在你的情况下:
SELECT short_description,
f_regex(short_description::text,'.*?\\[.*?\\].*?\\[.*?\\](\\[.*?\\])'::text) AS space
FROM my_table
答案 1 :(得分:0)
您可以使用Regex character classes来帮助进行此类匹配。在这里,我只寻找字母,括号括起来,以及后面的空格。注意使用双反斜杠\\
来转义文字括号和双括号[[:a:]]
的字符类
SELECT REGEXP_SUBSTR('[ABC12][1][ABCDEFG] ACB DEF [HIJ]','\\[[[:alpha:]]+\\] ');
regexp_substr
---------------
[ABCDEFG]
您还可以使用SPLIT_PART函数通过在右括号]
上拆分并选择第3个值来实现类似的功能。
SELECT SPLIT_PART('[ABC12][1][ABCDEFG] ACB DEF [HIJ]',']',3);
split_part
------------
[ABCDEFG
我建议尽可能使用内置函数而不是UDF。 UDF在您需要它们时非常棒,但它们确实会导致性能下降。