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

时间:2019-11-19 09:41:58

标签: python regex 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]'))

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

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

2 AVENUE DES LAPINOUS

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

2 个答案:

答案 0 :(得分:1)

不幸的是,没有办法使所有比赛都如火如荼。您可以使用 idx

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

有一个未合并的请求,可以在here

中找到

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

答案 1 :(得分: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]|
#+---------------------+--------------------------+