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