2014-01-18 2 views
6

Ich möchte eine Zeichenfolge mit mehreren Trennzeichen teilen, aber die Trennzeichen in der resultierenden Liste beibehalten. Ich denke, das ist eine nützliche Sache, um einen ersten Schritt zum Parsen jeder Art von Formeln zu machen, und ich vermute, dass es eine nette Python-Lösung gibt.Python: Wie kann ich die Trennzeichen in eine String-Aufteilung einschließen?

Jemand fragte eine ähnliche Frage in Java here.

Zum Beispiel kann eine typische Aufteilung sieht wie folgt aus:

>>> s='(twoplusthree)plusfour' 
>>> s.split(f, 'plus') 
['(two', 'three)', 'four'] 

Aber ich bin auf der Suche nach einem netten Art und Weise auf das Plus zurück in (oder bewahren Sie sie) hinzuzufügen:

['(two', 'plus', 'three)', 'plus', 'four'] 

Letztendlich ich möchte dies für jeden Betreiber und Halter tun, so dass, wenn es einen Weg gibt

['(', 'two', 'plus', 'three', ')', 'plus', 'four'] 

alle auf einmal zu bekommen, dann al l um so besser.

Antwort

11

Sie können das mit Pythons re Modul tun.

Sie können die Liste weglassen, wenn Sie nur einen Iterator benötigen.

4
import re 
s = '(twoplusthree)plusfour' 
l = re.split(r"(plus|\(|\))", s) 
a = [x for x in l if x != ''] 
print a 

Ausgang:

['(', 'two', 'plus', 'three', ')', 'plus', 'four'] 
3

Hier ist eine einfache Möglichkeit, mit re.split:

import re 

s = '(twoplusthree)plusfour' 
re.split('(plus)', s) 

Ausgang:

['(two', 'plus', 'three)', 'plus', 'four'] 

re.split ist sehr ähnlich zu string.split, außer dass Sie anstelle eines Literalbegrenzers ein Regex-Muster übergeben. Der Trick besteht darin, das Muster so zu setzen, dass es als Gruppe extrahiert wird.

Beachten Sie, dass Sie leere Zeichenfolgen haben werden, wenn es zwei aufeinanderfolgende occurrencies des Begrenzungsmuster

0

dieses Themas ist alt, aber seit seiner Top-Google-Ergebnis dachte ich an das Hinzufügen dieser:

wenn Wenn Sie Regex nicht verwenden möchten, gibt es einen einfacheren Weg. im Grunde nur Aufruf Split, aber setzen Sie das Trennzeichen mit Ausnahme der letzten Token

def split_keep_deli(string_to_split, deli): 
    result_list = [] 
    tokens = string_to_split.split(deli) 
    for i in xrange(len(tokens) - 1): 
     result_list.append(tokens[i] + deli) 
    result_list.append(tokens[len(tokens)-1]) 
    return result_list 
Verwandte Themen