2015-06-21 68 views
2

我需要确保一个字符串具有逗号分隔值。我读取的字符串可能有空格分隔的值。python注册,以包括缺少逗号

  • 有些逗号可能在我的输入字符串丢失,也就是说,如果没有逗号存在任何空间分隔值,我必须包括一个逗号
  • 我不应该做任何改变,以单引号或双中的字符串引号。这些引用的值可以包括除引号之外的任何字母数字。

一个例子字符串是:

""" 1, ' unchanged 1' " unchanged 2 " 2.009, -2e15 """ 

我应该包括逗号后 '不this1' 和后 “不是这个2”。

所以我得到的字符串应该是:

"""1,' unchanged 1'," unchanged 2 ",2.009,-2e15""" 

我一直在努力s1|s2|(s3)型正则表达式。但无法完成任务。

字符串可以有不同数量的值,以逗号分隔。

+0

你的意思是像'(应用re.sub(R “([\'?\”] * [\'\“])\ s“,r”\ 1,“,s)'? –

+0

不同的字符串可以有不同数量的值,以逗号分隔。例如。如果我将字符串更改为“”“1,'不变1'”不变2“2,2 45”“”Padraic's似乎并不奏效。 –

+0

PyParsing可能是一个更可读的方式来做到这一点,如果这是一个选项...? – thebjorn

回答

2

也许会更容易的最快方法使用findall,str.join和str.strip,首先在引号之间找到字符串,然后是所有非空白字符:

s = """ 1, ' unchanged 1' " unchanged 2 " 2.009, -2e15 3""" 

r = re.compile("[\'\"].*?[\'\"]|\S+") 
print(", ".join([x.strip(",") for x in r.findall(s)])) 

1, ' unchanged 1', " unchanged 2 ", 2.009, -2e11, ' unchanged 1', " unchanged 2 ", 2.009, -2e15, 35, 3 

如果你不希望逗号后的任何空间:

print(",".join([x.strip(",") for x in r.findall(s)])) 
1,' unchanged 1'," unchanged 2 ",2.009,-2e15,3 
+0

附加要求提出:在逗号分隔值之间可能没有空格。对于等式我的示例字符串可以是“”“1,”不变1“不变”2“2.009,-2e15”“”(不包括前1和逗号之间的空格)。在逗号前后可能会有多个逗号分隔值,没有任何空格。 –

+0

但是,两个非逗号分隔值之间会有一个或多个空格。 –

+0

另外,在引号或双引号字符串中可以有逗号。但这些不应该改变。例如。 “”“667000,”0 2“,100.0'spa ces',,10”“”应该返回我“”“”667000,“0 2”,100.0,'spa ces',,10“”“。 –

2

PyParsing肯定不会跑最快的方式,但它可能是把它写;-)

from pyparsing import * 

STRING = sglQuotedString | dblQuotedString 
NONSTRING = Word(alphanums + '.-') 
line = OneOrMore(STRING | NONSTRING | Suppress(',')) + lineEnd 


def insert_commas(s): 
    values = line.parseString(s).asList() 
    return ", ".join(values) 


s1 = """1, ' unchanged 1' " unchanged 2 " 2, 2""" 
s2 = """1, ' unchanged 1', " unchanged 2 " , 2, 2""" 
s3 = """ 1, ' unchanged 1' " unchanged 2 " 2, 2 45""" 
s4 = """1, 67.90e-34 67.90E-34 7.9093339333 2, 2 """ 

print insert_commas(s1) 
print insert_commas(s2) 
print insert_commas(s3) 
print insert_commas(s4) 

它打印

1, ' unchanged 1', " unchanged 2 ", 2, 2 
1, ' unchanged 1', " unchanged 2 ", 2, 2 
1, ' unchanged 1', " unchanged 2 ", 2, 2, 45 
1, 67.90e-34, 67.90E-34, 7.9093339333, 2, 2 
+0

感谢您提出解决方案。我不得不说这里的数字可以是浮点数,例如。“” “1,67.90e-34 67.90E-34 7.9093339333 2,2”“”。 –

+0

我将在明天检查时间消耗方面的表现。此时我无法访问大文件。 –

+0

感谢thebjorn。让我明天检查演出并让你知道。 –