You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PySpark中基于另一列动态替换正则占位符提取字符串问题

PySpark动态替换正则占位符提取匹配内容

解决方案:动态拼接正则表达式字符串

PySpark的regexp_extract虽要求正则参数为字符串,但可通过列拼接生成每行对应的动态正则,再传入函数完成提取。

1. 创建示例数据

from pyspark.sql import SparkSession
from pyspark.sql.functions import col, regexp_extract, concat, lit, format_string

spark = SparkSession.builder.appName("DynamicRegex").getOrCreate()

# 模拟输入数据
data = [
    ("SRC_INFO", "something SRC_INFO_S_3_DOOR"),
    ("SRC_USER", "test SRC_USER_X_789_FRAME")
]
df = spark.createDataFrame(data, ["SourceName", "Message"])

2. 方法一:用concat拼接正则

通过concat将SourceName列与正则固定部分拼接,生成每行专属的正则表达式:

df = df.withColumn(
    "code",
    regexp_extract(
        col("Message"),
        # 拼接正则:匹配 {SourceName}_S_数字_DOOR 格式,提取数字
        concat(lit(".*"), col("SourceName"), lit("_S_(\\d+)_DOOR.*")),
        1  # 提取第一个分组的内容(即数字)
    )
)

df.show()

3. 方法二:用format_string简化拼接

format_string支持占位符替换,写法更简洁:

df = df.withColumn(
    "code",
    regexp_extract(
        col("Message"),
        format_string(".*%s_S_(\\d+)_DOOR.*", col("SourceName")),
        1
    )
)

df.show()

输出结果

+----------+--------------------+----+
|SourceName|             Message|code|
+----------+--------------------+----+
|  SRC_INFO|something SRC_INFO...|   3|
|  SRC_USER|test SRC_USER_X_78...|    |
+----------+--------------------+----+

(第二行因不匹配_S_数字_DOOR格式返回空字符串,可根据需求调整正则逻辑)

关键说明

  • 核心思路是利用PySpark列表达式动态生成正则字符串,而非传入固定常量
  • 若需匹配不同模式,只需修改concat或format_string中的正则模板即可

内容的提问来源于stack exchange,提问作者Arpan Sarkar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 15:22:15