以列表作为搜索变量的Python正则表达式

以列表作为搜索变量的Python正则表达式,python,apache-spark,pyspark,apache-spark-sql,user-defined-functions,Python,Apache Spark,Pyspark,Apache Spark Sql,User Defined Functions,我有一个数据框,其中一列email\u address\u raw,每行包含多个电子邮件地址,我想创建一个新列,其中第一个电子邮件地址的特定电子邮件结尾列在一个长列表中 email_endings=['email_end1.com'、'email_end2.com'、'email_end3.com'、…] 我创建了下面的函数,它已经开始工作了,但是由于列表很长并且一直在构建中,我想在代码中对列表进行迭代或者类似的操作。我已经想到了一个循环,但不知何故我没有做到这一点 def email_addr

我有一个数据框,其中一列
email\u address\u 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")))

您可以使用
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\u extract
,如果不匹配,则将空字符串替换为
null
regexp\u 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)
    )
)