代码之家  ›  专栏  ›  技术社区  ›  Cherry Wu

如何通过Redshift-psql提取regex组

  •  2
  • Cherry Wu  · 技术社区  · 6 年前

    我在python和Redshift-psql上尝试的相同regex模式在python上有效,但在Redshift-psql上无效。

    我的字符串如下所示: s = 'AB.w127 xyz (9f6h, 89) amf, like mr .345x980 abcd' 我想提取“AB”和“.345x980”之间的所有内容 (“w127 xyz(9f6h,89)amf,如本例中的“mr”),此处的乘法会有所不同,两者之间的内容完全不可预测。 因此,在我的红移psql查询中,我使用 regexp_substr(s, 'AB\.(.*?)\.\d+x\d+.*?') .我希望至少能得到一些东西,以便以后我可以使用 group(1) 作为python逻辑。

    但Redshift一直向我显示这个错误:

    重复运算符之前的前一个正则表达式无效。分析正则表达式时出错:“AB.”(。 &燃气轮机&燃气轮机&燃气轮机;此处(>)&燃气轮机>)。d+xd+。 ?'。

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

    是否仍然可以使用红移psql提取字符串?

    2 回复  |  直到 6 年前
        1
  •  2
  •   wp78de    6 年前

    不幸的是,亚马逊红移功能 POSIX regex 它不支持惰性量词。

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


    关于您提出的如何提取中间文本的问题,我们几乎没有使用Redshift的regex特性的选项。 全部的 大多数好东西都是不受支持的。最好先提取,然后使用 CHARINDEX SUBSTRING 隔离内部零件。

    然而,最后一个技巧是使用

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

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

        2
  •  0
  •   Cherry Wu    6 年前

    非常感谢您的回答!终于用解决了问题 regexp_replace(s, 'AB\.|\.\\d+x\\d+.*') ,这里我必须使用 \\d ,否则红移给我空结果