在 PySpark 中提取多个正则表达式匹配项
Extracting several regex matches in PySpark
我目前正在开发一个正则表达式,我想 运行 在 PySpark Dataframe 的列上。
此正则表达式仅用于捕获一组,但可以 return 多个 匹配项。
我遇到的问题是 PySpark 本机正则表达式的函数(regexp_extract 和 regexp_replace)似乎只允许组操作(通过 $ 操作数)。
有没有办法本地(PySpark 函数,没有 python 的 re.findall-based udf)获取与我匹配的子字符串列表正则表达式(我不是在谈论 first 匹配中包含的组) ?
我想做这样的事情:
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, '[0] - [0]'))
用$1代表第一个匹配的数组,以此类推...
您可以尝试使用以下正则表达式输入来查看我希望获取的匹配示例。
2 AVENUE DES LAPINOUS
它应该 return 4 场不同的比赛,每场有 1 组。
遗憾的是,无法在 spark 中获取所有匹配项。您可以使用 idx
指定匹配索引
func.regexp_extract('col', my_regex, idx=1)
有一个未合并的相同请求可以找到here
TL;DR:到目前为止,您需要为此编写一个 UDF
在 Spark 3.1+ 中可以使用 regexp_extract_all
regexp_extract_all(str, regexp[, idx])
- Extract all strings in the str
that match the regexp
expression and corresponding to the regex group index.
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]|
#+---------------------+--------------------------+
我目前正在开发一个正则表达式,我想 运行 在 PySpark Dataframe 的列上。
此正则表达式仅用于捕获一组,但可以 return 多个 匹配项。 我遇到的问题是 PySpark 本机正则表达式的函数(regexp_extract 和 regexp_replace)似乎只允许组操作(通过 $ 操作数)。
有没有办法本地(PySpark 函数,没有 python 的 re.findall-based udf)获取与我匹配的子字符串列表正则表达式(我不是在谈论 first 匹配中包含的组) ?
我想做这样的事情:
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, '[0] - [0]'))
用$1代表第一个匹配的数组,以此类推...
您可以尝试使用以下正则表达式输入来查看我希望获取的匹配示例。
2 AVENUE DES LAPINOUS
它应该 return 4 场不同的比赛,每场有 1 组。
遗憾的是,无法在 spark 中获取所有匹配项。您可以使用 idx
指定匹配索引func.regexp_extract('col', my_regex, idx=1)
有一个未合并的相同请求可以找到here
TL;DR:到目前为止,您需要为此编写一个 UDF
在 Spark 3.1+ 中可以使用 regexp_extract_all
regexp_extract_all(str, regexp[, idx])
- Extract all strings in thestr
that match theregexp
expression and corresponding to the regex group index.
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]|
#+---------------------+--------------------------+