首页 > 解决方案 > 正则表达式:摆脱连续的标点符号

问题描述

我试图使用以下代码清理列表中的单词:

#define function to clean list of words
def clear_list(words_list):
    regex = re.compile('[\w\d]{2,}', re.U)
    filtered = [i for i in words_list if regex.match(i)]
    return filtered

clear_list_udf = sf.udf(clear_list, ArrayType(StringType()))

items = items.withColumn("clear_words", clear_list_udf(sf.col("words")))

我只需要不带标点符号的大于 1 个字母的单词。但是在以下情况下我会遇到问题:

我有什么:
["""непутевые, заметки"", с, дмитрием, крыловым"] -->
[заметки"", дмитрием, крыловым"]

我需要什么:
["""непутевые, заметки"", с, дмитрием, крыловым"] -->
[непутевые, заметки, дмитрием, крыловым]

标签: pythonregexpyspark

解决方案


您可以使用 regexp_replace 然后过滤 df 以在 pyspark 本身中实现结果。

我们应该尽可能避免使用 UDF,因为 UDF 就像一个会产生火花的黑匣子。它不能有效地对其进行优化。在这里阅读更多

from pyspark.sql.functions import regexp_replace, col, length

df = df.select(regexp_replace(col("col_name"), "[^a-zA-Z0-9]", ""))
df = df.where(length(col("col_name")) >= 2)


推荐阅读