【问题标题】:How to extract regex group through Redshift psql如何通过 Redshift psql 提取正则表达式组
【发布时间】:2018-10-17 20:23:53
【问题描述】:

我在 python 和 Redshift psql 上尝试过的相同正则表达式模式在 python 上有效,但在 Redshift psql 上无效。

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

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

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

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

有没有办法用 Redshift psql 提取字符串?

【问题讨论】:

  • 也许试试这个模式? '^AB\\.(.*)\\.\\d+x\\d+.*$'
  • 您能否编辑问题并提供更多输入示例和所需输出,以便我们为您测试正则表达式?
  • 如果贪心版不好,请发一个更完整的测试样本。
  • 已编辑。在这种情况下,我想提取“w127 xyz (9f6h, 89) amf, like mr”。

标签: regex amazon-redshift psql


【解决方案1】:

不幸的是,Amazon Redshift 仅具有不支持惰性量词的 POSIX regex

也就是说,您似乎不需要它们,AB\.(.*)\.\d+x\d+ 应该这样做。


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

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

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

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

【讨论】:

  • 最后一个技巧可能是使用regexp_replace( text, '.*AB\.|\.\d+x\d+.*')
  • regex_replace() 确实给了我很好的启发!我只是做了一点改动,问题就解决了,使用regexp_replace(s, 'AB\.|\.\\d+x\\d+.*')
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2016-08-18
    • 2019-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-06
    • 1970-01-01
    • 2011-04-29
    相关资源
    最近更新 更多