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 正则表达式在空格前获取子字符串的主要内容,如果未能解决你的问题,请参考以下文章