2016-12-14 6 views
1

コンマを使用して文字列内のアルファベット文字(文字)を分割したいが、私は保存したいアルファベット以外の文字もある。Python:文字列のすべてのアルファベット文字の後にカンマを挿入します。

例(入力 - >所望の出力):

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

最大1が存在することができ、 " - " は、与えられた文字の前に。

最初の試みはjoinメソッドを使用していましたが、文字列かどうかに関係なく、文字列の任意の文字に適用されます。

'、'。join( " - ABC")は、私が望んでいない " - 、A、B、C"を返す

何か提案がありますか?

+0

入力文字列はアルファベット以外の文字で終了しますか? –

+0

私の実際的なケースでは、文字列が1つの非アルファベット文字のみで構成されている場合にのみ発生します。" - " – FLab

答えて

3

マッチ文字が、最後に手紙を除外するために、負の先読みを使用します。

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

はこのPythonのセッションで、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 'で\ g <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]は少しクルージ的であることを認めるが、それはです文字列の最後にあるかどうかを調べるために、すべての文字についてインデックスチェックを行うよりも効率的です。

入力文字列が非アルファ文字で終わることができれば、我々はこれを行うことができます:

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,-' 

[OK]を、それは最初のバージョンよりも、おそらくkludgierですが、ねえ、それは動作します。 :)

私が先に述べたように、正規表現の置換はおそらくこれを行うための元気な方法です。

関連する問題