如何在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;
这个正则的逻辑是:
- 先匹配
AB.开头 - 然后匹配任意非点字符,遇到点时检查后面是否是
\d+x\d+——如果不是,就继续匹配 - 直到遇到符合条件的
.\d+x\d+为止 - 最后用第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
相关产品推荐
相关产品推荐

