【问题标题】:Python RegEx with List as search variables使用 List 作为搜索变量的 Python RegEx
【发布时间】:2021-06-25 13:09:46
【问题描述】:

我有一个数据框,其中有一列 email_adress_raw,每行包含多个电子邮件地址,我想创建一个新列,其中第一个电子邮件地址的特定电子邮件结尾列在一个长列表中。

email_endings = ['email_end1.com','email_end2.com','email_end3.com',...]

我创建了以下函数,它已经在工作,但是由于列表很长并且一直在构建中,我想对代码中的列表或类似的东西进行迭代。我已经想到了一个循环,但不知何故我没有设法做到......

def email_address_new(s):
    try:
        r = re.search("([\w.-]+@"+email_endings[0]+"|[\w.-]+@"+email_endings[1]+"|[\w.-]+@"+email_endings[2]+")", s).group()
    except AttributeError:
        print(s)
        return None
    except TypeError:
        print(s)
        return None
    return r

udf_email_address_new= F.udf(email_address_new, StringType())

df = df.withColumn("email", udf_email_address_new(F.col("email_adress_raw")))

【问题讨论】:

    标签: python apache-spark pyspark apache-spark-sql user-defined-functions


    【解决方案1】:

    您可以使用join 将列表中的电子邮件结尾组合到正则表达式模式:

    email_endings = ['email_end1.com','email_end2.com','email_end3.com']
    
    def email_address_new(s):
        try:
            pattern = "([\w.-]+@" + "|[\w.-]+@".join(email_endings) + ")"
            r = re.search(pattern, s).group()
        except AttributeError:
            print(s)
            return None
        except TypeError:
            print(s)
            return None
        return r
    
    udf_email_address_new= F.udf(email_address_new, StringType())
    
    df2 = df.withColumn("email", udf_email_address_new(F.col("email_adress_raw")))
    

    但您可能不需要为此目的使用 UDF。你可以直接使用regexp_extract,如果不匹配则用null替换空字符串(如果不匹配,regexp_extract返回一个空字符串)

    import pyspark.sql.functions as F
    
    email_endings = ['email_end1.com','email_end2.com','email_end3.com']
    pattern = "([\w.-]+@" + "|[\w.-]+@".join(email_endings) + ")"
    
    df2 = df.withColumn(
        "email", 
        F.when(
            F.regexp_extract(F.col("email_adress_raw"), pattern, 1) != "",
            F.regexp_extract(F.col("email_adress_raw"), pattern, 1)
        )
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-29
      • 2016-03-07
      • 1970-01-01
      相关资源
      最近更新 更多