2015-06-21 66 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。讓我明天檢查演出並讓你知道。 –