使用 pyspark 中的正则表达式将数字添加到字符串中最后一个字符之前的字符串

Posted

技术标签:

【中文标题】使用 pyspark 中的正则表达式将数字添加到字符串中最后一个字符之前的字符串【英文标题】:Add number to a string before the last character in the string using regex in pyspark 【发布时间】:2021-01-25 22:42:30 【问题描述】:

我需要使用pyspark 在字符串中的最后一个字符(即在火花数据帧的列中)之前添加相同的数字。 例如,假设我有字符串2020_week42021_week5。我需要在 4 和 5 前面添加一个 0,如下所示:2020_week042021_week05。更大的背景是替换是有条件的 - 仅适用于个位数的周。所以大致如下:

df.withColumn('week', when(len(col("week")) == 10, regexp_replace(week, REGEX_PATTERN, "0")).otherwise(col("week")))

需要注意的是,对于需要替换的单个数字字符串,week 列的长度始终为 10 个字符。

根据@thefourthbird 关于正则表达式的建议,我尝试了以下方法:

df1.withColumn('week', when(len(col("week")) == 10, regexp_replace(week, "^\d4_week(?=\d$)", "$00")).otherwise(col("week")))

我得到的错误与正则表达式本身无关,而是如何在 pyspark 中实现正则表达式。错误:

TypeError: object of type 'Column' has no len()

我也试过了:

import pyspark.sql.functions as F

df1.withColumn('week', when(F.length("week") == 10, regexp_replace(week, "^\d4_week(?=\d$)", "$00")).otherwise(col("week")))

错误:

NameError: name 'week' is not defined

更新:

df10.withColumn('week', when(length(col('week')) == 10, regexp_replace("week", "(?<=k)(?=\d$)", "0")).otherwise(col("week")))

【问题讨论】:

也许是(?&lt;=k)(?=\d$)? ^\d4_week(?=\d$) 并替换为$00 谢谢,所以我想我的部分问题是在 pyspark 中实现这一点,我会用尝试合法正则表达式时遇到的错误进行更新。 感谢@Nick,您的建议奏效了。 @CyrusMohammadian 不用担心 - 我很高兴它很有用。请注意,您不需要长度测试,因为此正则表达式只会匹配以 k 和单个数字结尾的内容 【参考方案1】:

您可以使用substringconcat 函数,它们适用于任何字符串(无需使用正则表达式):

from pyspark.sql import functions as F


df = spark.createDataFrame([("2020_week4",), ("2021_week5",)], ["value"])

df.withColumn(
    "value",
    F.concat(
        F.expr("substring(value, 1, length(value)-1)"),
        F.lit('0'),
        F.substring("value", -1, 1)
    )
).show()

#+-----------+
#|      value|
#+-----------+
#|2020_week04|
#|2021_week05|
#+-----------+

【讨论】:

以上是关于使用 pyspark 中的正则表达式将数字添加到字符串中最后一个字符之前的字符串的主要内容,如果未能解决你的问题,请参考以下文章

Pyspark:UDF 将正则表达式应用于数据帧中的每一行

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

xslt将正则表达式中的数字添加到节点值

如何替换/删除 PySpark RDD 中的正则表达式?

什么正则表达式函数有助于将数字添加到现有数字? [复制]

pyspark 中的正则表达式来检查字母和空格(也可以使用 uni 代码)