正则表达式在 PySpark Dataframe 列中查找所有不包含 _(Underscore) 和 :(Colon) 的字符串

Posted

技术标签:

【中文标题】正则表达式在 PySpark Dataframe 列中查找所有不包含 _(Underscore) 和 :(Colon) 的字符串【英文标题】:Regular expression to find all the string that does not contains _(Underscore) and :(Colon) in PySpark Dataframe column 【发布时间】:2020-07-21 06:59:39 【问题描述】:

我在数据框中有一列名为 "tags"。我需要根据条件提取值。条件是它不应包含 _(下划线) 和 :(冒号)。

例如:

"tags": "你好,amount_10,amount_90,total:100"

预期结果:

“new_column”:“嗨,你好”

供您参考:

我提取了所有的金额标签

collectAmount = udf(lambda s: list(map(lambda amount: amount.split('_')[1] if len(collection) > 0
                        else amount, re.findall(r'(amount_\w+)', s))), ArrayType(StringType()))

productsDF = productsDF.withColumn('amount_tag', collectAmount('tags'))

【问题讨论】:

我们应该先用,分割单词吗? 标签列的类型是什么?你能创建一个minimal reproducible example吗? 是的,@Ankur。你是对的..... 标签的类型是 String.... @cronoik 【参考方案1】:

试试这个

df.withColumn('new_column',expr('''concat_ws(',',array_remove(transform(split(tags,','), x -> regexp_extract(x,'^(?!.*_)(?!.*:).+$',0)),''))''')).show(2,False)

+-------------------------------------------+----------+
|tags                                       |new_column|
+-------------------------------------------+----------+
|hai, hello, amount_10, amount_90, total:100|hai, hello|
|hai, hello, amount_10, amount_90, total:100|hai, hello|
+-------------------------------------------+----------+

【讨论】:

完美...! @Shubham 耆那教 使用更简单的正则表达式,regexp_extract(x,'^[^_:]+$',0)【参考方案2】:

真的不需要正则表达式:

tags = ["hai", "hello", "amount_10", "amount_90", "total:100"]

new_column = [tag for tag in tags if not any(junk in tag for junk in ["_", ":"])]
print(new_column)

如果你坚持使用正则表达式:

import re
rx = re.compile(r'^(?!.*_)(?!.*:).+$')
new_column = [tag for tag in tags if rx.match(tag)]
print(new_column)

a demo on regex101.com

【讨论】:

你好@Jan。这不是python中的普通列表。它是 pyspark 数据框。【参考方案3】:

您可以按照上面的答案使用正则表达式,但您需要将其包装在 udf 中,或者如下所示,使用 pyspark 内置函数:

from pyspark.sql import functions as F

df= df.withColumn("extracted", F.regexp_extract("tags","[_:]", 0))
df.filter(df["extracted"] == '').select("tags").show()

【讨论】:

它没有给出确切的结果@ags29。 +----------+ |plain_tags| +----------+ | :| | _| | _| | _|我一个人搞定这个 是的,请。如果你能提供一个样本,那么我会修改我的答案。

以上是关于正则表达式在 PySpark Dataframe 列中查找所有不包含 _(Underscore) 和 :(Colon) 的字符串的主要内容,如果未能解决你的问题,请参考以下文章

在 pyspark 中找到正则表达式?

在 PySpark 中提取多个正则表达式匹配项

PySpark 中的正则表达式

pyspark用正则表达式替换正则表达式

应用逻辑后,正则表达式模式在 pyspark 中不起作用

如何在 PySpark 中编写条件正则表达式替换?