我在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 的正则表达式功能几乎没有选择。都大多数好东西都是不支持的。最好先提取,然后使用CHARINDEX
和SUBSTRING
来隔离内部。
但是,最后一个技巧是使用
regexp_replace( text, '.*AB.|.\d+x\d+.*')
如链接文档中所述,POSIX 样式的 \d 字符类必须使用两个反斜杠 (\
) 或使用等效的字符类表达式,例如[[:digit:]]
非常感谢答案!最后用regexp_replace(s, 'AB.|.\d+x\d+.*')
解决了问题,这里我不得不用\d
,否则Redshift给我空的结果