我目前正在处理要在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个组。
答案 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]|
#+---------------------+--------------------------+