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

PySpark中按指定字符位置插入特殊字符的实现方案

PySpark按指定字符数插入分隔符的解决方案

针对你需要将字符串M202876QC0581AADMM01格式化为M-202876-QC0581-AA-DMM01的需求,提供两种可行方案:

方案一:正则表达式替换法

利用正则分组匹配固定长度的字符段,再用分隔符连接各组。你的原代码问题在于正则仅匹配数字且分组长度不符合规则,修正后的正则会匹配整个字符串的结构:

  • 第1组:1个任意字符
  • 第2组:接下来6个任意字符
  • 第3组:接下来6个任意字符
  • 第4组:接下来2个任意字符
  • 第5组:剩余所有字符

代码示例:

import pyspark.sql.functions as F

df = spark.createDataFrame([('M202876QC0581AADMM01',)], ['str'])
result_df = df.withColumn(
    "formatted_str",
    F.regexp_replace(
        F.col("str"),
        r"^(.{1})(.{6})(.{6})(.{2})(.+)$",
        "$1-$2-$3-$4-$5"
    )
)
result_df.show(truncate=False)

输出结果:

+-------------------+-------------------------+
|str                |formatted_str            |
+-------------------+-------------------------+
|M202876QC0581AADMM01|M-202876-QC0581-AA-DMM01|
+-------------------+-------------------------+

方案二:字符串截取拼接法

通过substring按固定位置截取各段,再用concat_ws用分隔符连接,逻辑更直观,适合固定长度分割场景:

import pyspark.sql.functions as F

df = spark.createDataFrame([('M202876QC0581AADMM01',)], ['str'])
result_df = df.withColumn(
    "formatted_str",
    F.concat_ws(
        "-",
        F.substring("str", 1, 1),    # 取第1个字符
        F.substring("str", 2, 6),    # 从第2位开始取6个字符
        F.substring("str", 8, 6),    # 从第8位开始取6个字符
        F.substring("str", 14, 2),   # 从第14位开始取2个字符
        F.substring("str", 16, 5)    # 从第16位开始取剩余5个字符
    )
)
result_df.show(truncate=False)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 11:55:18