如何在pyspark中使用regexp_replace函数达到理想的结果?

问题描述 投票:0回答:1

假设数据是 -

"King Khaled Hospital """"NG"""""

长度(包括引号和空格)= 33

在上面的例子中:

  1. 保持起始和结束引号完整意味着位置 1 和位置 33
  2. NG之前有4个双引号。所以让它们只有 1。
  3. NG后,29、30、31、32、33位置有5个双引号。 第 33 个双引号应保留原样,因为它以 1 结尾。 29, 30, 31, 32 应转换为 1 个双引号。

最终输出:

"King Khaled Hospital "NG""

长度=27

这只是一个例子。数据可以是任何东西。

dataframe pyspark regexp-replace apache-spark-dataset
1个回答
0
投票

设置

df.show()

+---------------------------------+
|col                              |
+---------------------------------+
|"King Khaled Hospital """"NG"""""|
|foo ""baz""                      |
|"foo bar"                        |
|"foo """bar""" ""baz"""          |
|"""foo"""                        |
+---------------------------------+

让我们使用 regexp_replace 将两个或多个连续出现的引号替换为单引号。请记住,这里我假设数据集中的字符串始终由相同数量的引号包围,例如,如果前面有一个单词有 4 个引号,那么后面必须有 4 个引号

result = df.withColumn('clean_col', F.regexp_replace('col', r'("{2,})([^"]+)\1', r'"$2"'))

结果

+---------------------------------+---------------------------+
|col                              |clean_col                  |
+---------------------------------+---------------------------+
|"King Khaled Hospital """"NG"""""|"King Khaled Hospital "NG""|
|foo ""baz""                      |foo "baz"                  |
|"foo bar"                        |"foo bar"                  |
|"foo """bar""" ""baz"""          |"foo "bar" "baz""          |
|"""foo"""                        |"foo"                      |
+---------------------------------+---------------------------+
© www.soinside.com 2019 - 2024. All rights reserved.