组合 regexp_extract 和 regexp_replace 以屏蔽 pyspark 数据框列中的数字

Combine regexp_extract and regexp_replace to mask numbers in pyspark dataframe column

我有一个 PySpark DataFrame,df 像这样:

|-----|-------|
|index|address|
|-----|-------|
|1|123 Apple Street|
|2|123-45-6789 Broad Street|
|-----|-------|

我的正则表达式模式 r"\d{3}-\d{2)-\d{4}|\d{3} \d{2) \d{4}" 将过滤第 2 行。但是,我需要屏蔽匹配项,并且它必须是 1:1 匹配项。因此,在上面的示例中,更新后的值应该是 XXX-XX-XXXX Broad Street,而不是 X Broad Street。 像这样:

|-----|-------|
|index|address|
|-----|-------|
|1|123 Apple Street|
|2|XXX-XX-XXXX Broad Street|
|-----|-------|

我试过在 regexp_extract 调用上嵌套 regex_replace 调用,如下所示:

regexp_replace(regexp_extract(df["address"], "\d{3}-\d{2)-\d{4}|\d{3} \d{2) \d{4}", 0), "\d", "X")

但是,我收到一条错误消息,基本上表明我没有将字符串或类似字符串的对象传递给外部 regexp_replace 函数。

有没有办法结合 regexp_replaceregexp_extract 函数来更新子字符串?

试试这个方法。

        from pyspark.sql import functions as F

        df = sc.parallelize([
            (1, "123 Apple Street"), (2 ,"123-45-6789 Broad Street")
        ]).toDF(["index", "address"])

        df.show(truncate = False)

      +-----+------------------------+
      |index|address                 |
      +-----+------------------------+
      |1    |123 Apple Street        |
      |2    |123-45-6789 Broad Street|
      +-----+------------------------+

        df2 = df.withColumn("address", F.when(F.col('address').rlike("\d{3}-\d{2}-\d{4}|\d{3} \d{2} \d{4}"), F.regexp_replace(F.col('address'),r'\d','X')).otherwise(F.col('address')))

        df2.show(truncate=False)



        +-----+------------------------+
        |index|address                 |
        +-----+------------------------+
        |1    |123 Apple Street        |
        |2    |XXX-XX-XXXX Broad Street|
        +-----+------------------------+