将Pyspark中的括号替换为replace_regex

6
+---+------------+
|  A|           B|
+---+------------+
| x1|        [s1]|
| x2|   [s2 (A2)]|
| x3|   [s3 (A3)]|
| x4|   [s4 (A4)]|
| x5|   [s5 (A5)]|
| x6|   [s6 (A6)]|
+---+------------+

期望的结果:

+---+------------+-------+
|A  |B           |value  |
+---+------------+-------+
|x1 |[s1]        |[s1]   |
|x2 |[s2 (A2)]   |[s2]   |
|x3 |[s3 (A3)]   |[s3]   |
|x4 |[s4 (A4)]   |[s4]   |
|x5 |[s5 (A5)]   |[s5]   |
|x6 |[s6 (A6)]   |[s6]   |
+---+------------+-------+

当我使用以下代码时,括号和其前面的空格没有被替换:

from pyspark.sql.functions import expr
df.withColumn("C",
               expr('''transform(B, x-> regexp_replace(x, ' \\(A.\\)', ''))''')).show(truncate=False)

或者
df.withColumn("C",
               expr('''transform(B, x-> regexp_replace(x, ' \(A.\)', ''))''')).show(truncate=False)

得到的结果:
+---+------------+------------+
|A  |B           |value       |
+---+------------+------------+
|x1 |[s1]        |[s1]        |
|x2 |[s2 (A2)]   |[s2 ()]     |
|x3 |[s3 (A3)]   |[s3 ()]     |
|x4 |[s4 (A4)]   |[s4 ()]     |
|x5 |[s5 (A5)]   |[s5 ()]     |
|x6 |[s6 (A6)]   |[s6 ()]     |
+---+------------+------------+

1
你是在寻找 df.withColumn("C", F.regexp_replace('B', '[\\(\\)]', '')) 吗? - werner
@ Werner,这适用于字符串值的列,但我需要针对数组值。谢谢。 - Sadek
1
@Cary Swoveland,感谢您的评论,我编辑了问题并展示了所需的结果。 - Sadek
如果我理解正确的话,您想要将 regexp_replace 应用于每个数组元素。是这样吗? - werner
尝试使用 df.withColumn("value", F.expr("""transform(B,x-> regexp_replace(x,"\ (.*\)",''))""")) - murtihash
显示剩余2条评论
2个回答

2
您可以创建一个UDF,以删除数组中与正则表达式r"\(.*\)"匹配的所有元素。如果需要,您可以更改正则表达式以匹配r"\(A.\)"(如果需要)。
import re
replaced = F.udf(lambda arr: [s for s in arr if not re.compile(r"\(.*\)").match(s)], \
                 T.ArrayType(T.StringType()))
df.withColumn("value", replaced("B")).show()

1
你可以将数组值进行分割,并从中获取第一个索引
  • (或者)使用regexp_replace函数。

示例:

df.show()
#+---+---------+
#|  A|        B|
#+---+---------+
#| x1|     [s1]|
#| x2|[s2 (A2)]|
#+---+---------+

df.printSchema()
#root
# |-- A: string (nullable = true)
# |-- B: array (nullable = true)
# |    |-- element: string (containsNull = true)

df.withColumn("C",expr('''transform(B,x -> split(x,"\\\s+")[0])''')).show()

#using regexp_replace function
df.withColumn("C",expr('''transform(B,x -> regexp_replace(x,"(\\\s+.*)",""))''')).show()
df.withColumn("C",expr('''transform(B,x -> regexp_replace(x,"(\\\s+\\\((?i)A.+\\\))",""))''')).show()
#+---+---------+----+
#|  A|        B|   C|
#+---+---------+----+
#| x1|     [s1]|[s1]|
#| x2|[s2 (A2)]|[s2]|
#+---+---------+----+

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接