python - 使用 List 作为搜索变量的 Python RegEx
问题描述
我有一个数据框,每行包含一个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")))
解决方案
您可以使用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)
)
)
推荐阅读
- python - Python 导入模块与 __init__.py 中的函数共享名称
- static-analysis - 有没有办法配置 cppcheck 并能够为 alloc/dealloc 指定位置参数号
- linux - 对于从网络文件系统安装的文件夹,Python glob 返回空?
- spring - 在 Spring 中发布 resttemplate 不起作用并获得工作
- sql - 在 JPA 实体列名称中管理单个撇号(单引号)
- javascript - 当我尝试执行弹出窗口时,为什么会抛出找不到页面错误?
- reactjs - 服务器上启用的 CORS 仍然收到标头错误
- python - 动态日期范围数据切片
- azure - 在 terraform 中配置网关时的“用于应用服务”参数
- java - 比较数组并删除重复项