2016-11-11 9 views
1

Pythonを使用して前処理文字列が必要です。 例を示します。Pythonの特殊記号の前後に空白を挿入する

文字列

string = "hello... (world)!" 

を考えると、私は私がすることによってこれを行う機能を交換する方法を見つける

desired_string = "hello . . . (world) !" 

などの特殊文字の前後にスペースを挿入します。その後

string = string.replace(".", " . ") 
string = string.replace("(", " (") 
string = string.replace(")", ") ") 
string = string.replace("!", " ! ") 

>>> string 
'hello . . . (world) ! ' 

(この出力文字列がdesired_stringよりも多くのスペースを持っていますが、私はうまく後で.split方法を適用するために許容されます。)

しかし、コードが長いので、特に多くの種類のシンボルが表示されます。 (例:!、@、$、%、&、...)

もっと良い方法があると思います(re.subを使用していますか?)誰かがより良いコードを表示できますか?

答えて

1

reを使用して、所望の文字の前後に空白を追加します:

import re 

pat = re.compile(r"([.()!])") 
print (pat.sub(" \\1 ", string)) 
# hello . . . (world) ! 
+0

ありがとうございました。 '\\ 1'とは何ですか? – ywat

+0

この場合は '[。()!]'となる最初のグループのために '()'括弧のような複数のグループを持ち、 '\\ 1'、' \\ 2'、 '\グループ全体に 're'を適用するには\ 3'を使用します。 'r" \ 1 "'とすることもできます。 –

+0

私はこの回答を受け入れます。これは最も速く、はっきりしているからです。 – ywat

0

単純なジェネレータ式を使用して問題を解決することができます。あなたのケースでreの必要なし:用船者は「特別」である場合

>>> string = "hello... (world)!" 
>>> ''.join((' {} '.format(el) if el in '.()!' else el for el in string)) 
'hello . . . (world) ! ' 
>>> 

これはstringとテスト内の各文字をループ発電することによって動作しません。そうである場合は、の空白を囲む文字が返されます。それ以外の場合は、現在の文字が返されます。次に、''.join()は、式から返されるジェネレータオブジェクトを結合するために使用されます。

0

あなたはisaplha()を使用することができます。

data = "hello... (world)!" 

for c in data[:]: 
    if not c.isalpha(): 
     data = data.replace(c, " %s " % c) 

print(data) 
関連する問題