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

w41d8nur  于 2022-12-22  发布在  Spark
关注(0)|答案(2)|浏览(233)

我目前正在处理一个正则表达式,我想在PySpark Dataframe的列上运行该正则表达式。
这个正则表达式只捕获一个组,但是可能返回几个匹配。我遇到的问题是,PySpark原生正则表达式的函数(regexp_extract和regexp_replace)似乎只允许组操作(通过$操作数)。
有没有办法原生地(PySpark函数,没有python的基于 re.findall 的udf)获取与我的正则表达式匹配的子字符串列表(我不是在谈论包含在firstmatch中的组)?
我希望这样做:

my_regex = '(\w+)'
# Fetch and manipulate the resulting matches, not just the capturing group
df = df.withColumn(df.col_name, regexp_replace('col_name', my_regex, '$1[0] - $2[0]'))

$1表示第一个匹配项,以此类推......
您可以尝试下面的regex输入来查看我希望获取的匹配的示例。

2 AVENUE DES LAPINOUS

它应该返回4个不同的匹配项,每个匹配项包含1个组。

vngu2lb8

vngu2lb81#

在**Spark 3.1+**中,可以使用regexp_extract_all

regexp_extract_all(str, regexp[, idx])-提取str中与regexp表达式匹配并对应于正则表达式组索引的所有字符串。

df = spark.createDataFrame([('2 AVENUE DES LAPINOUS',)], ['col'])
df.show(truncate=False)
#+---------------------+
#|col                  |
#+---------------------+
#|2 AVENUE DES LAPINOUS|
#+---------------------+

df = df.withColumn('output', F.expr(r"regexp_extract_all(col, '(\\w+)', 1)"))

df.show(truncate=False)
#+---------------------+--------------------------+
#|col                  |output                    |
#+---------------------+--------------------------+
#|2 AVENUE DES LAPINOUS|[2, AVENUE, DES, LAPINOUS]|
#+---------------------+--------------------------+
vbkedwbf

vbkedwbf2#

遗憾的是,没有办法在spark中获取所有匹配项。您可以使用idx指定匹配的索引

func.regexp_extract('col', my_regex, idx=1)

存在一个相同的未合并请求,可在here中找到

TL;DR:到目前为止,您需要为此编写UDF

相关问题