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

Ame*_*sys 8 python regex string apache-spark pyspark

我目前正在开发一个正则表达式,我想在 PySpark Dataframe 的列上运行它。

该正则表达式仅用于捕获一组,但可以返回多个匹配项。我遇到的问题是,PySpark 本机正则表达式的函数(regexp_extract 和 regexp_replace)似乎只允许组操作(通过 $ 操作数)。

有没有一种方法可以本地(PySpark函数,没有python的基于re.findall的udf)获取与我的正则表达式匹配的子字符串列表(我不是在谈论第一个匹配中包含的组)?

我想做这样的事情:

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]'))
Run Code Online (Sandbox Code Playgroud)

$1 代表第一个匹配的数组,依此类推......

您可以尝试以下正则表达式输入来查看我希望获取的匹配项的示例。

2 AVENUE DES LAPINOUS
Run Code Online (Sandbox Code Playgroud)

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

Zyg*_*ygD 10

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]|
#+---------------------+--------------------------+
Run Code Online (Sandbox Code Playgroud)

  • 啊! 您的方法将起作用,因为它使用“expr”,而不是“pyspark.sql.functions.regexp_extract_all”函数。 (3认同)

roc*_*987 3

不幸的是,没有办法让所有的比赛都在火花中进行。您可以使用idx指定匹配索引

func.regexp_extract('col', my_regex, idx=1)
Run Code Online (Sandbox Code Playgroud)

有一个未合并的请求,可以在这里找到

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