提问人:alka 提问时间:11/10/2023 最后编辑:alka 更新时间:11/13/2023 访问量:61
如何使用pyspark中的regexp_replace函数获得理想的结果?
How to achieve desirable result using regexp_replace function in pyspark?
问:
假设数据是 -
"King Khaled Hospital """"NG"""""
长度(包括引号和空格)= 33
在上面的例子中:
- 保持起始和结束引号不变,均表示位置 1 和位置 33
- 在 NG 之前,有 4 个双引号。所以让它们只有 1。
- NG之后,在29、30、31、32、33的位置有5个双引号。 第 33 个双引号应保留,因为它是结束的。29、30、31、32 应转换为 1 个双引号。
最终输出:
"King Khaled Hospital "NG""
长度 = 27
这只是一个例证。数据可以是任何东西。
让我举一个帖子的例子:
我的df:
>>>
>>> df.select('full_nm').where(df['eid'] == '60806998').show(truncate=False)
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|full_nm |
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""King Khaled Hospital """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""NG"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""|
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
最终输出:
"King Khaled Hospital "NG""
如果我使用以下代码:
>>> df_temp = df.withColumn('full_nm', regexp_replace('full_nm', r'("{2,})([^"]+)\1', r'"$2"'))
>>> df_temp.select('full_nm').where(df_temp['eid'] == '60806998').show(truncate=False)
23/11/13 08:58:51 WARN Utils: Truncated the string representation of a plan since it was too large. This behavior can be adjusted by setting 'spark.debug.maxToStringFields' in SparkEnv.conf.
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|full_nm |
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|"King Khaled Hospital ""NG"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""|
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
答:
1赞
Shubham Sharma
11/11/2023
#1
设置
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" |
+---------------------------------+---------------------------+
评论
0赞
alka
11/13/2023
嗨,我在问题中添加了几行。请看一下,感谢您的回复。
0赞
alka
11/13/2023
引号可以是任何数字。
0赞
alka
11/14/2023
嗨,请问我有什么回应吗?
0赞
alka
11/14/2023
左边和右边的报价数量也可以变化
0赞
Shubham Sharma
11/14/2023
Lemme在某个时候研究一下。
评论