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

Posted

技术标签:

【中文标题】在 PySpark 中提取多个正则表达式匹配项【英文标题】:Extracting several regex matches in PySpark 【发布时间】:2019-11-19 09:41:58 【问题描述】:

我目前正在处理一个我想在 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]'))

$1 表示第一个匹配为一个数组,以此类推...

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

2 AVENUE DES LAPINOUS

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

【问题讨论】:

regex中只有一个匹配项。也许你需要this 我正在更新正则表达式,以后会更容易掌握。 不幸的是,没有办法获得所有匹配项。您可以使用func.regexp_extract('col', my_regex, idx=1)指定匹配索引。您需要为此编写一个UDF。.. here 是一个已经提出的问题.. 好吧,这很遗憾,但感谢您提出这一点。我希望它们不会持续太久来发布它,感觉就像玩正则表达式时必须具备的一样。那么UDF就是... 【参考方案1】:

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("regexp_extract_all(col, '(\\\\w+)', 1)"))

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

【讨论】:

根据SPARK-34214 和PR 31306,这在PySpark 3.2 之前将不可用。 我可以发誓我在 3.1 上测试过。 啊!您的方法将有效,因为它使用 expr,而不是 pyspark.sql.functions.regexp_extract_all 函数。【参考方案2】:

不幸的是,没有办法在 spark 中获得所有匹配项。您可以使用 idx

指定匹配索引
func.regexp_extract('col', my_regex, idx=1)

有一个相同的未合并请求可以在here找到

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

【讨论】:

以上是关于在 PySpark 中提取多个正则表达式匹配项的主要内容,如果未能解决你的问题,请参考以下文章

Power BI R 脚本正则表达式仅返回第一个匹配项

正则表达式

从 pandas 数据框列中查找所有正则表达式匹配项

PySpark textFile 命令中的正则表达式

正则表达式在PHP中搜索多个匹配项

使用正则表达式查找两个字符串之间的多个匹配项