You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Redshift psql中提取正则分组?正则在Python可用但Redshift失效

解决Redshift正则与Python不兼容的问题

嘿,我来帮你搞定这个正则匹配的坑~

你遇到的问题本质是Redshift默认的正则引擎和Python不一样:Python用的是Perl兼容正则(PCRE),支持.*?这种非贪婪量词;但Redshift默认用POSIX扩展正则(ERE),不识别非贪婪语法,所以你的正则在Redshift里会失效。

针对你的需求(提取AB.到第一个.\d+x\d+之间的内容),给你两种解决方案:

方案一:启用Perl兼容模式(推荐,和Python写法一致)

Redshift其实支持PCRE,只要在regexp_substr里加上'p'标志就行,这样你原来的正则几乎不用改就能用:

SELECT regexp_substr(s, 'AB\.(.*?)\.\d+x\d+', 1, 1, 'p') AS extracted_content
FROM your_table;
  • 'p'参数告诉Redshift使用PCRE引擎,和Python的正则行为完全对齐
  • .*?非贪婪量词会正常工作,精准匹配到第一个.\d+x\d+之前的内容

方案二:用POSIX ERE语法替代非贪婪量词

如果不想依赖PCRE模式,可以用正向否定预查来避免贪婪匹配,写法如下:

SELECT regexp_substr(s, 'AB\.([^.]*(?:\.(?!\d+x\d+)[^.]*)*)\.\d+x\d+', 1, 1, '', 1) AS extracted_content
FROM your_table;

这个正则的逻辑是:

  1. 先匹配AB.开头
  2. 然后匹配任意非点字符,遇到点时检查后面是否是\d+x\d+——如果不是,就继续匹配
  3. 直到遇到符合条件的.\d+x\d+为止
  4. 最后用第6个参数1指定返回第一个捕获组的内容(Redshift的regexp_substr支持直接提取捕获组)

验证示例

针对你的测试字符串:

s = 'AB.w127 xyz (9f6h, 89) amf, like mr .345x980 abcd'
两种方案都会正确提取出:w127 xyz (9f6h, 89) amf, like mr

小提示:如果在SQL客户端里遇到反斜杠转义问题,可以把正则里的\改成\\(比如AB\\.(.*?)\\.\\d+x\\d+)。

内容的提问来源于stack exchange,提问作者Cherry Wu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:04:47