2016-12-14 495 views
1

我想用逗號分割字符串中的字母字符(字母),但我也有非字母字符,我想保留。Python:在字符串的每個字母字符後插入逗號

實例(輸入 - >所需的輸出):

"ABC" -> "A,B,C" 
"-ABC" -> "-A,B,C" 
"AB-C" -> "A,B,-C" 

可以有一個最大 「 - 」 一個給定的字母之前。

我的第一次嘗試是使用連接方法,但它適用於字符串的任何字符,不管是否是字母。

例如','。join(「 - ABC」)給出了「 - ,A,B,C」這不是我想要的

任何建議?

+0

輸入字符串是否會以非字母字符結尾? –

+0

在我的實際情況下,只有在字符串只包含一個非alpha字符時纔會發生,例如「 - 」 – FLab

回答

3

匹配的字母,但使用負前瞻排除在最後的一封信:

re.sub(r'([A-Z])(?!$)', r'\1,', inputstring) 

online demo at regex101.com,這條巨蟒會議:

>>> import re 
>>> re.sub(r'([A-Z])(?!$)', r'\1,', 'ABC') 
'A,B,C' 
>>> re.sub(r'([A-Z])(?!$)', r'\1,', '-ABC') 
'-A,B,C' 
>>> re.sub(r'([A-Z])(?!$)', r'\1,', 'AB-C') 
'A,B,-C' 
+0

不需要捕捉整個模式,因爲您始終可以用'r'來引用整個匹配值\ m <0>' –

+0

@WiktorStribiżew:meh,您可以在模式中引入詳細信息(組捕獲)或替換模式(不得不使用'g'和尖括號)。 –

+1

這不是一個「冗長」的事情:捕獲爲子匹配創建一個內存緩衝區。 –

0

isalpha是,可以是一個函數在任何string對象上調用都會返回bool值來檢查字母是否存在。

def split_char(s): 
    final = [] 
    temp = '' 
    for i in s: 
     if i.isalpha(): 
      final.append(temp+i) 
      temp = '' 
     else: 
      temp = temp + i 

    return final 

print split_char('-ABC') 

>>>['-A', 'B', 'C'] 

temp_list = split_char('AB-C') 
print ','.join(temp_list) 

>>> A,B,-C 
1

這可能是對正則表達式的工作,但你可以.join它,你只需要使用一個列表理解與測試。

如果輸入字符串以非字母字符永遠不會結束,你可以這樣做:

data = ("ABC", "-ABC", "AB-C") 
for s in data: 
    t = ''.join([c + ',' if c.isalpha() else c for c in s])[:-1] 
    print('{!r}\t-> {!r}'.format(s, t)) 

輸出

'ABC' -> 'A,B,C' 
'-ABC' -> '-A,B,C' 
'AB-C-' -> 'A,B,-C,-' 

我承認[:-1]有點缺憾,但它的可能比對每個char進行索引檢查更有效,以查看它是否在字符串的末尾。

如果輸入字符串可以在非字母字符結束,我們可以這樣做:

data = ("ABC", "-ABC", "AB-C", "A-BC-") 
for s in data: 
    t = ''.join([c + ',' if c.isalpha() else c for c in s[:-1]] + [s[-1]]) 
    print('{!r}\t-> {!r}'.format(s, t)) 

輸出

'ABC' -> 'A,B,C' 
'-ABC' -> '-A,B,C' 
'AB-C' -> 'A,B,-C' 
'A-BC-' -> 'A,-B,C,-' 

好吧,它可能比第一個版本kludgier,但嘿,它的作品。 :)

正如我前面所說,正則表達式替換可能是完成此任務的理智方式。

相關問題