如何在PySpark中提取字符串中以V开头加6位数字的元素?
解决PySpark提取所有以V开头后跟6位数字元素的问题
问题分析
你当前代码返回空列的原因有两个:
- 正则表达式写的是
(R\\d{6}),匹配的是以R开头的字符串,但你需要的是以V开头的,正则规则不匹配 regexp_extract仅能提取第一个匹配项,无匹配时返回空字符串,无法直接生成包含所有匹配结果的List列
解决方案
方法1:Spark 3.1+版本(推荐)
Spark 3.1及以上版本提供regexp_extract_all函数,可直接提取所有符合正则规则的匹配项,返回数组类型列:
import pyspark.sql.functions as F # 提取所有以V开头、后跟6位数字的字符串 df = df.withColumn("test", F.regexp_extract_all('Text', r'V\d{6}', 0))
执行后test列的值为["V345667", "V345778"],完全符合需求。
方法2:Spark 3.1以下版本兼容方案
若你的Spark版本低于3.1,可通过regexp_replace保留匹配项后,再用split分割为数组:
import pyspark.sql.functions as F # 先保留所有匹配项并用逗号分隔,再分割为数组,最后过滤空元素 df = df.withColumn( "test", F.split( F.regexp_replace('Text', r'(.*?)(V\d{6}|$)', r'$2,'), ',' ).filter(F.col('test') != '') )
处理后结果
最终数据集如下:
| ID | Text | test |
|---|---|---|
| 1 | abc edf V345667 iii abe V345778 abc 1234 ab 12 V17 abe | ["V345667", "V345778"] |
内容的提问来源于stack exchange,提问作者nbs335
相关产品推荐
相关产品推荐

