2016-08-15 11 views
1

を使用せずにoneliner置き換える:Pythonは、私はここに私のコードを持っている正規表現

a = u"\n".join(my_array).replace(u"\n\n", u"\n") 

問題がある場合は"\n\n\n\n"あなたはだから私は」"\n\n"を残し、私はちょうど "\n"

をしたいしているということです来る:

a = u"\n".join(my_array) 
while a.find(u"\n\n")>=0: 
    a = a.replace(u"\n\n", u"\n") 

もっとエレガントな方法があるかどうか疑問に思っていたoneliner regexpを使わずにこれをPythonで行うには?

u"\n".join(s.replace(u'\n', '') for s in my_array)) 
+0

@DeepakKamat:

reduce(lambda x,y: (x+y).replace('\n\n', '\n'), x) 

をしかし、正規表現は、よりエレガントになり、私はOPが終わっ複数のループをやって避けたいという感覚を得ます入力文字列... –

+1

なぜ正規表現を使用しないのですか?また、通常、「1ライナーの質問」への答えは次のとおりです。関数を書く。 –

+0

また、 '\ n'で結合した後に重複した' \ n'を削除するのはなぜですか?結合前に '\ n'を取り除く方が簡単ではないでしょうか? 'my_array'の文字列の中に' \ n \ n'を置くことはできますか?入力データと予想される出力を表示する必要があります。 –

答えて

3

をあなたは本当に1行で正規表現を使用せずにこれを実行したい場合は、単一\nに複数\nの全配列を低減するための一つの方法は、最初splitされるようになりますおそらくこれは助けることができる

+0

私はそれが大好きです私はそれが大丈夫ならば検証してみるよ –

0

\nによって、そして次にjoinは、空でないすべてのセグメントを単一の\nで除算します。ここで

>>> a = "foo\n\nbar\n\n\nblub\n\n\n\nbaz" 
>>> "\n".join(x for x in a.split("\n") if x) 
'foo\nbar\nblub\nbaz' 

あなたが"\n".join(my_array)をした、とmy_arrayもともと、例えば、より良い解決策があるかもしれないものに応じた後、a全体文字列、すなわちですそれにもかかわらず、参加する前に個々のラインから\nを剥がしてください。

+0

'my_array'の文字列の一部に、改行が埋め込まれていない場合、つまり文字列の末尾にない文字列が含まれていない場合があります。 –

2

改行のシーケンスを1つの改行に変換するには、改行で文字列を分割してから、空の文字列をフィルタリングしてから再結合します。例えば、

mystring = u"this\n\nis a\ntest string\n\nwith embedded\n\n\nnewlines\n" 
a = u'\n'.join(filter(None, mystring.split(u'\n'))) 
print '{0!r}\n{1!r}'.format(mystring, a) 

これは後続の改行を排除し、それは大したことないことを出力

u'this\n\nis a\ntest string\n\nwith embedded\n\n\nnewlines\n' 
u'this\nis a\ntest string\nwith embedded\nnewlines' 

注意。

+1

かなり良い見えます。 1つのこと:OPの入力は文字列ではなく配列です。 – ailin

+0

@ailin:確かに。文字列のリストがすでに1つの文字列に結合されているので、私は物事をきれいにする方法を示していました。 OPは文字列のサンプルリストを提供していませんでした。(すでに述べたように)入力リストの文字列がそうでない場合、より効率的な戦略があるかもしれないので、文字列の正確な形式について推測したくないです埋め込み改行を含みます。 –

1

動作するはずreduceを使用する:

re.sub('\n+', '\n', x) 
関連する問題