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
相关产品推荐
相关产品推荐

