我在 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+x\d+.*?')
。我希望至少能得到一些东西,以便以后我可以使用 group(1)
作为Python逻辑。
但是 Redshift 一直向我显示此错误:
Invalid preceding regular expression prior to repetition operator. The error occured while parsing the regular expression: 'AB.(.?>>>HERE>>>).d+xd+.?'.
我还尝试了模式 AB\\.(.*?)\\.\\d+x\\d+.*?')
,但仍然遇到同样的错误。
是否可以使用 Redshift psql 提取字符串?
最佳答案
不幸的是,Amazon Redshift 仅具有 POSIX regex不支持惰性量词。
也就是说,看起来您不需要它们,AB\.(.*)\.\d+x\d+
应该可以。
关于您的问题如何提取中间的文本,我们对 Redshift 的正则表达式功能几乎没有选择。 All 大多数好东西都是不受支持的。最好先提取,然后使用 CHARINDEX
和 SUBSTRING
来隔离内部部分。
但是,最后一个技巧是使用
regexp_replace( text, '.*AB\.|\.\\d+x\\d+.*')
如链接文档中所述,POSIX 样式\d 字符类必须使用两个反斜杠 (\\
) 或使用等效的字符类表达式,例如[[:数字:]]
关于regex - 如何通过 Redshift psql 提取正则表达式组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50224201/