Pyspark SparkSQL 正则表达式在空格前获取子字符串

Posted

技术标签:

【中文标题】Pyspark SparkSQL 正则表达式在空格前获取子字符串【英文标题】:Pyspark SparkSQL regex to get substring before space 【发布时间】:2020-12-19 13:18:26 【问题描述】:

我在 Athena 中编写了一个 SQL,它使用 regex_extract 从列中提取子字符串,它提取字符串,其中有“X10003”并占用空间出现时。例如从 5570 - Site 811111 - X10003-10447-XXX-20443 (CAMP) 它提取 X10003-10447-XXX-20443 并在 Athena 中使用 REGEXP_EXTRACT(site, 'X10033.*?\w+-\d+') 工作正常。

现在我将它转换为 sparkSQL 并且它不能正常工作,我应用了不同的方法但没有任何效果,例如我使用了表达式: Regexp_extract("5570 - Site 811111 - X10003-10447-XXX-20443 (CAMP)", 'X10003([^\s]+)') 给了我-10447-XXX-20443 (CAMP) 这不是我需要的。

谁能告诉我我做错了什么?

【问题讨论】:

【参考方案1】:

你可以使用

REGEXP_EXTRACT(site, '(X10003.*?[A-Za-z0-9]-[0-9]+)', 1)

请参阅regex demo。

(X10003.*?[A-Za-z0-9]-[0-9]+) 模式是一个 捕获组,其 ID 为 1 匹配

X10003 - 文字字符串 .*? - 除换行符之外的零个或多个字符,尽可能少 [A-Za-z0-9] - 一个字母数字字符 - - 一个连字符 [0-9]+ - 一位或多位数字。

【讨论】:

它工作了 :) 它也能与 RLIKE 一起工作吗? @shzyincu 它也应该与 RLIKE 一起使用。我认为您甚至不需要括号,它们仅用于告诉REGEXP_EXTRACT我们要提取的内容。在 RLIKE 中,它不提取任何内容,正则表达式仅用于测试那里的匹配。【参考方案2】:

放大捕获组:

Regexp_extract("5570 - Site 811111 - X10003-10447-XXX-20443 (CAMP)", '(X10003[^\s]+)')
#                                                             here ___^

【讨论】:

它给出 X10003-10447-XXX-20443 (CAMP) 作为响应,而不是我想要的 @shzyincu:真的吗?它不应该,它应该在第一个空格之前停止。

以上是关于Pyspark SparkSQL 正则表达式在空格前获取子字符串的主要内容,如果未能解决你的问题,请参考以下文章

pyspark用正则表达式替换正则表达式

在 pyspark 中找到正则表达式?

在 PySpark 中提取多个正则表达式匹配项

PySpark 中的正则表达式

应用逻辑后,正则表达式模式在 pyspark 中不起作用

如何在 PySpark 中编写条件正则表达式替换?