2016-08-15 9 views
1

ich meinen Code haben hier:Python ersetzen oneliner ohne regexp mit

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

Das Problem ist, dass, wenn es "\n\n\n\n" Sie mit "\n\n" gelassen werden und ich möchte nur ein"\n"

Also ich ve kommen mit:

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

ich mich gefragt, ob es eine elegantere Weg ist/vielleicht oneliner ohne regexp dies in Python zu tun?

+0

@DeepakKamat: Ich habe das Gefühl, dass die OP mehrere Schleifen über das vermeiden, möchte tun Eingabezeichenfolge ... –

+1

Warum nicht Regex verwenden? In der Regel lautet die Antwort auf "One-Liner-Fragen": Schreiben Sie eine Funktion. –

+0

Warum entfernen Sie auch doppelte '\ n' nach dem Beitritt von' \ n'? Wäre es nicht einfacher, '\ n' vor dem Beitritt zu entfernen? Kann es '\ n \ n' in den Strings in' my_array' geben? Sie sollten einige Eingabedaten und die erwartete Ausgabe anzeigen. –

Antwort

3

Wenn Sie wirklich diesen in einer Linie tun wollen und ohne regulären Ausdruck, einen Weg, um alle Sequenzen von mehrer würde \n zu einzelnen \n zu reduzieren, um seine ersten split von \n und dann join alle nicht leeren Segmente von einem einzigen \n. Hier

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

, a ist die gesamte Zeichenfolge, das heißt, nachdem Sie "\n".join(my_array) tat, und je nachdem, was my_array ursprünglich ist, kann es bessere Lösungen, z.B. Strippen \n aus den einzelnen Zeilen vor dem Beitritt, aber das wird trotzdem funktionieren.

+0

Ich liebe es Ich werde versuchen und zu validieren, wenn es in Ordnung ist –

0

vielleicht kann dies helfen:

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

Vielleicht, es sei denn, einige der Zeichenfolgen in "my_array" enthalten eingebettete Zeilenumbrüche, d. H. Solche, die nicht am Ende der Zeichenfolge sind. –

2

Um Sequenzen von Zeilenumbrüchen in einzelne Zeilenumbrüche zu konvertieren, können Sie die Zeichenfolge in Zeilenumbrüche teilen und dann die leeren Zeichenfolgen vor dem erneuten Verbinden herausfiltern. ZB

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) 

Ausgang

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

Beachten Sie, dass dies keine Hinterzeilenumbrüche beseitigt, aber das sollte kein großes Problem sein.

+1

sieht ziemlich gut aus. Eine Sache: Eingabe in OP ist Array, nicht String. – ailin

+0

@ailin: Sicher. Ich habe gerade gezeigt, wie man Dinge aufräumt, nachdem die Liste der Strings bereits zu einer einzigen Zeichenfolge zusammengefügt wurde. Das OP lieferte keine Beispielliste von Strings, und ich würde es vorziehen, nicht über das genaue Format seiner Strings zu spekulieren, da es (wie bereits erwähnt) eine effizientere Strategie geben könnte, wenn die Strings in der Input-Liste dies nicht tun enthält eingebettete Zeilenumbrüche. –

1

reduce verwenden sollte funktionieren:

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

wäre jedoch reguläre Ausdrücke elegantere:

re.sub('\n+', '\n', x)