如何在PySpark DataFrame中去除重复标点并保留最后一个?
PySpark去除连续重复标点符号方案
需求说明
需要去除文本中连续重复的标点符号,仅保留单个(例如:!!!!→!,!!$$→!$),同时将文本中的连续空白字符合并为单个空格。
数据集
现有PySpark数据集如下:
temp = spark.createDataFrame([ (0, "This is Spark!!!!"), (1, "I wish Java could use case classes!!##"), (2, "Data science is cool#$@!"), (3, "Machine!!$$") ], ["id", "words"])
数据集展示:
+---+--------------------------------------+ |id |words | +---+--------------------------------------+ |0 |This is Spark!!!! | |1 |I wish Java could use case classes!!##| |2 |Data science is cool#$@! | |3 |Machine!!$$ | +---+--------------------------------------+
错误尝试
之前尝试用以下代码删除特定标点,但未实现连续标点去重的需求:
df2 = temp.select( [F.regexp_replace(col, r',|\.|&|\\||-|_', '').alias(col) for col in temp.columns] )
解决方案
正则表达式思路
核心正则逻辑:
([^\w\s])\1+:匹配连续重复的非单词/非空白字符(即标点符号),其中([^\w\s])捕获单个标点,\1+匹配该标点的连续重复部分- 将匹配到的连续重复标点替换为单个捕获的标点(
$1) - 额外用
\s+匹配连续空白字符,替换为单个空格,贴合输出要求
实现代码
from pyspark.sql import functions as F # 先处理连续标点去重,再合并连续空格 df_result = temp.select( "id", F.regexp_replace( F.regexp_replace("words", r'([^\w\s])\1+', r'$1'), r'\s+', ' ' ).alias("words") ) # 查看处理结果 df_result.show(truncate=False)
输出结果
执行后得到符合要求的输出:
+---+----------------------------------------+ |id |words | +---+----------------------------------------+ |0 |This is Spark! | |1 |I wish Java could use case classes!# | |2 |Data science is cool#$@! | |3 |Machine!$ | +---+----------------------------------------+
内容的提问来源于stack exchange,提问作者merkle
相关产品推荐
相关产品推荐

