如何通过Redshift psql提取正则表达式组



我在python和Redshift psql上尝试的正则表达式模式适用于python,但不适用于Redshift psql。

我的字符串看起来像这样:s = 'AB.w127 xyz (9f6h, 89) amf, like mr .345x980 abcd'我想提取"AB"和".345x980"之间的所有内容(在这种情况下,"w127 xyz (9f6h, 89) amf,如mr"),这里的乘数会有所不同,中间的内容是完全不可预测的。 所以在我的 Redshift psql 查询中,我使用了regexp_substr(s, 'AB.(.*?).d+xd+.*?').我希望至少得到一些东西,以便以后我可以将group(1)用作python逻辑。

但是Redshift一直向我显示此错误:

重复运算符之前的正则表达式无效。 解析正则表达式时出错:"AB.(.?>>>这里>>>).d+xd+.?'.

我也尝试了AB\.(.*?)\.\d+x\d+.*?')模式,但仍然得到同样的错误。

无论如何可以使用Redshift psql提取字符串吗?

不幸的是,Amazon Redshift 仅提供不支持惰性量词的 POSIX 正则表达式。

也就是说,看起来你不需要它们,AB.(.*).d+xd+应该这样做。


关于您的问题 如何提取中间的文本 我们对 Redshift 的正则表达式功能几乎没有选择。大多数好东西都是不支持的。最好先提取,然后使用CHARINDEXSUBSTRING来隔离内部。

但是,最后一个技巧是使用

regexp_replace( text, '.*AB.|.\d+x\d+.*') 

如链接文档中所述,POSIX 样式的 \d 字符类必须使用两个反斜杠 (\) 或使用等效的字符类表达式,例如[[:digit:]]

非常感谢答案!最后用regexp_replace(s, 'AB.|.\d+x\d+.*')解决了问题,这里我不得不用\d,否则Redshift给我空的结果

最新更新