pyspark在分隔符上拆分,使用正则表达式忽略双引号

时间:2018-03-27 15:31:10

标签: regex csv pyspark

我很新兴。我正在尝试使用rdds。所以这是我的基本rdd

rdd=sc.parallelize(['"ab,cd",9', 'xyz,6'])

现在如果我想在逗号上拆分它

rdd.map(lambda x:x.split(",")).collect()

给了我

[['ab', 'cd', '9'], ['xyz', '6']]

由于我想忽略放在""中的文字之间的逗号,我写了

rdd.map(lambda x:x.split(",(?=([^\\\"]*\\\"[^\\\"]*\\\")*[^\\\"]*$)")).collect()   

给出输出

[['ab,cd,9'], ['xyz,6']]  (因此这不是一个重复的问题)

但是我希望输出类似于.split(",")那样的输出

[['ab,cd','9'], ['xyz','6']]

我对正则表达式不是很好,所以我不知道如何操纵它来获得输出。 任何帮助将不胜感激

1 个答案:

答案 0 :(得分:0)

 

您可以使用this answer修改,代替;的模式:

import re
pattern = r"""((?:[^,"']|"[^"]*"|'[^']*')+)"""
rdd.map(lambda x: re.split(pattern , x)[1::2]).collect()
#[['"ab,cd"', '9'], ['xyz', '6']]

[1::2]表示从列表1开始,列出列表中的所有其他项目。更多关于understanding python's slice notation

此模式匹配字段(不是分隔符),因此如果没有切片,您将获得:

[['', '"ab,cd"', ',', '9', ''], ['', 'xyz', ',', '6', '']]

更新

如果您只想忽略双引号(而不是单引号)之间的分隔符,则可以按如下方式修改模式:

pattern = r"""((?:[^,"]|"[^"]*")+)"""
rdd=sc.parallelize(["xy'z,6",'"ab,cd",5'])
rdd.map(lambda x: re.split(pattern , x)[1::2]).collect()
#[["xy'z", '6'], ['"ab,cd"', '5']]