Spalten von Strings mit re.split

Ich habe mehrere Streicher (> 1000) der Form:

\r\nSenor Sisig\nThe Chairman\nCupkates\nLittle Green Cyclo\nSanguchon\nSeoul on Wheels\nKasa Indian\n\nGo Streatery\nWhip Out!\nLiba Falafel\nGrilled Cheese Bandits\r\n 

Die Saiten können einen Whitespace vor dem '\ n'

Wie spalte ich diese Strings (in einer effizienten Weise), um zu vermeiden, irgendwelche leeren oder doppelten (die whitespace Fall) Elemente zu erhalten?

Ich habe mit:

 re.split(r'\r|\n', str) 

EDIT: einige weitere Beispiele:

 \r\nThe Creme Brulee Cart \r\nCurry Up Now\r\nKoJa Kitchen\r\nAn the Go\r\nPacific Puffs\r\nEbbett's Good to Go\r\nFiveten Burger\r\nGo Streatery\r\nHiyaaa\r\nSAJJ\r\nKinder's Truck\r\nBlue Saigon\r \r\nThe Chairman\r\nSanguchon\r\nSeoul on Wheels\r\nGo Streatery\r\nStreet Dog Truck\r\nKinder's Truck\r\nYummi BBQ\r\nLexie's Frozen Custard\r\nDrewski's Hot Rod Kitchen\r \n An the Go \n Cheese Gone Wild \n Cupkates \n Curry Up Now \n Fins on the Hoof\n KoJa Kitchen\n Lobsta Truck \n Oui Chef \n Sanguchon\n Senor Sisig \n The Chairman \n The Rib Whip 

Vielen Dank!

4 Solutions collect form web for “Spalten von Strings mit re.split”

Ihr Beispiel zeigt keinen "Whitespace vor dem \n " mit Ausnahme eines einzigen optionalen \r .

Wenn das alles ist, was du versuchst zu handhaben, anstatt dich auf \r oder \n teilen, spalte dich auf eine mögliche \r und eine definitive \n :

 re.split(r"\r?\n", s) 

Natürlich geht das davon aus, dass du kein nacktes \r ohne \n hast. Wenn Sie \r , \r\n und \n alle gleich behandeln müssen (ähnlich Pythons universelle Newline-Unterstützung …):

 re.split(r"\r|\n|(\r\n)", s) 

Oder einfacher:

 re.split(r"(\r|\n)+", s) 

Wenn du führende Räume, Tabs, mehrere \r , etc. entfernen möchtest, kannst du das im regexp machen oder einfach nur lstrip auf jedem Ergebnis aufrufen:

 map(str.lstrip, re.split(r"\r|\n", s)) 

… aber das kann dich mit leeren Elementen verlassen. Du könntest diese herausfiltern, aber es ist wahrscheinlich besser, einfach auf irgendeinen Run von Whitespace zu spalten, der mit einem \n stattdessen endet:

 re.split(r"\s*\n", s) 

Das wird immer noch leere Elemente am Anfang und am Ende verlassen, denn dein String beginnt und endet mit Newlines, und das ist, was re.split soll. Wenn du sie beseitigen möchtest, kannst du die Zeichenfolge vor dem Parsing entweder strip oder nach dem Parsing die Endwerte werfen:

 re.split(r"\s*\n", s.strip()) re.split(r"\s*\n", s)[1:-1] 

Ich denke, eines dieser beiden letzten ist genau das, was du willst … aber das ist wirklich nur eine Vermutung auf der Grundlage der begrenzten Informationen, die du gabst. Wenn nicht, dann sollte einer der anderen (zusammen mit seiner Erklärung) hoffentlich genug für Sie sein zu schreiben, was Sie wirklich wollen.


Von deinen neuen Beispielen aus sieht es aus wie das, was du wirklich aufspalten willst, ist jeder Lauf von Whitespace, der mindestens einen \n . Und dein Eingang kann am Anfang und am Ende auch Zeilenumbrüche haben (dein erstes Beispiel hat beides, dein zweites hat \r\n am Anfang aber nichts am Ende …), und du möchtest sie ignorieren wenn es tut. Damit:

 re.split(r"\s*\n\s*", s.strip()) 

Doch an diesem Punkt könnte es sich lohnen, zu fragen, warum Sie versuchen, dies als String statt als Textdatei zu analysieren. Angenommen, Sie haben diese aus einer Datei oder Datei-wie Objekt, anstatt dieser:

 with open(path, 'r') as f: s = f.read() results = re.split(regexpr, s.strip()) 

… so etwas könnte viel besser lesbar sein, und mehr als schnell genug (vielleicht nicht so schnell wie die optimale regexp, aber immer noch so schnell, dass jede verschwendete string-verarbeitungszeit durch die eigentliche datei Lesezeit sowieso überschwemmt wird):

 with open(path, 'r') as f: results = filter(None, map(str.strip, f)) 

Vor allem, wenn Sie nur einmal über diese Liste iterieren wollen, in welchem ​​Fall (vorausgesetzt, entweder Python 3.x, oder mit ifilter und imap von itertools if 2.x) diese Version muss nicht die gesamte Datei in den Speicher und Prozess zu lesen Es bevor du anfängst deine eigentliche Arbeit zu machen.

 re.split(r'[\s\n\r]+', str.strip()) 
 >>> s = "\r\nSenor Sisig\nThe Chairman\nCupkates\nLittle Green Cyclo\nSanguchon\nSeoul on Wheels\nKasa Indian\n\nGo Streatery\nWhip Out!\nLiba Falafel\nGrilled Cheese Bandits\r\n" >>> [x for x in s.strip("\r\n").split("\n") if x] ['Senor Sisig', 'The Chairman', 'Cupkates', 'Little Green Cyclo', 'Sanguchon', 'Seoul on Wheels', 'Kasa Indian', 'Go Streatery', 'Whip Out!', 'Liba Falafel', 'Grilled Cheese Bandits'] 

Wenn du auf regex bestehtest

 >>> import re >>> re.split(r"[\r\n]+", s.strip("\r\n")) ['Senor Sisig', 'The Chairman', 'Cupkates', 'Little Green Cyclo', 'Sanguchon', 'Seoul on Wheels', 'Kasa Indian', 'Go Streatery', 'Whip Out!', 'Liba Falafel', 'Grilled Cheese Bandits'] 

Füllen Sie einfach die leeren Werte aus

 list(ifilter(None, re.split(r"\r|\n", your_string))) 

Pythons reguläre Ausdrücke bieten Ihnen die \s -character-Klasse, die mit jedem Whitespace in [ \t\n\r\f\v] übereinstimmt (es sei denn, UNICODE-Flag ist gesetzt, dann hängt es von der verwendeten Zeichendatenbank ab).

Wie in den anderen Antworten (@abarnert) erwähnt, könnte deine Regex \s*\n was 0 oder mehr Leerzeichen ist, die mit einem \n enden. Unten ist ein Beispiel.

 In [1]: import re In [2]: from itertools import ifilter In [3]: my_string = """\r\nSenor Sisig \nThe Chairman\nCupkates\nLittle Green Cyclo\nSanguchon\nSeoul on Wheels\nKasa Indian\n\nGo Streatery\nWhip Out!\nLiba Falafel\nGrilled Cheese Bandits\r\n""" In [4]: list(ifilter(None, re.split(r"\s*\n", my_string))) Out[4]: ['Senor Sisig', 'The Chairman', 'Cupkates', 'Little Green Cyclo', 'Sanguchon', 'Seoul on Wheels', 'Kasa Indian', 'Go Streatery', 'Whip Out!', 'Liba Falafel', 'Grilled Cheese Bandits'] 

Beachten Sie, dass ich ifilter aus dem itertools Paket verwende . Sie könnten filter oder eine Liste comp verwenden.

Wie so:

 [x for x in re.split("\s*\n", my_string) if x] 
  • Sys.argv als Bytes in Python 3k
  • Leere Zeichenfolge aus der Liste entfernen
  • TypeError: nicht unterstützter Operanden Typ (s) für -: 'int' und 'str'
  • Konvertieren einer Zeichenfolge zu einer Liste von Wörtern?
  • Gute Handhabung von NoneType-Objekten beim Drucken in Python
  • Spalte nicht doppelte Wörter mit Python String Split ()?
  • Python: Zahlen aus einer Zeichenfolge extrahieren
  • Mehrfache Zeichen ersetzen mit Python
  • Python: Wie kann ich einen String als Referenz übergeben?
  • Hinzufügen einer Variablen in Content Disposition Antwortdatei name-python / django
  • Ziehen von Teilen aus einer Schnur (Python)
  • Python ist die beste Programmiersprache der Welt.