PySpark Databricks正则表达式:在指定位置添加双引号
PySpark正则表达式修复字符串格式问题
需求与数据示例
原始数据(DataFrame的value列):
abc,1,2,345,765,876,Kumar r,Raghvan ,04041996 # 第6个逗号后已存在双引号 abc,1,2,345,765,876,"sam Bailey,20541789 abc,1011,2,32,678,,,,,
预期输出:
abc,1,2,345,765,876,"Kumar r,Raghvan" ,04041996 abc,1,2,345,765,876,"sam Bailey",20541789 abc,1011,2,32,678,,,,,
需要实现:在第6个逗号之后、末尾数字段之前的内容前后添加双引号;若已有前引号,则补全后引号。
无效代码
此前尝试的正则替换未达成预期:
df_with_quotes = df.withColumn("data_with_quotes",regexp_replace(col("data"), r"((?:[^,],){6})([^\"].[^\"$])(,[^,]+$)", r'\1"\2"\3'))
可行解决方案
以下是修正后的PySpark代码,可同时处理无引号和已有前引号的场景:
from pyspark.sql.functions import col, regexp_replace df_with_quotes = df.withColumn( "data_with_quotes", regexp_replace( col("value"), r"((?:[^,]+,){6})(\"?)([^,\d]+)(,[\d]+$)", r"\1\"\3\"\4" ) )
正则匹配逻辑:
((?:[^,]+,){6}):精准匹配前6个逗号分隔的字段,作为第一个捕获组保留原始内容(\"?):匹配可选的前双引号,后续统一替换为完整的引号包裹([^,\d]+):匹配第6个逗号后、末尾数字段前的非数字非逗号内容,这是需要添加引号的核心部分(,[\d]+$):匹配末尾的逗号加数字段,保留原始内容
替换时直接给核心内容(第3组)前后加上双引号,自动覆盖已有前引号的情况;对于无匹配项的记录(如最后一行),正则不生效,保持原始内容不变。
内容的提问来源于stack exchange,提问作者Mayura Pujari
相关产品推荐
相关产品推荐

