2016-07-27 9 views
2

Der Versuch, spalten diese Zeile enthalten:Wie eine mathematische Formel spalten, die von Variablen besteht, die Striche

formula='%abc-def%+%hij-klm%/%opq+rst%-%uvw-xyz% 

Die Variable mit den "%" Zeichen enthalten und muss erhalten bleiben.

Ich möchte auf +-/* aufgeteilt werden, ohne die Variable aufgrund der '-' im Namen zu teilen.

Gibt es einen einfachen Weg, ohne eine for-Schleife zu verwenden, um jedes Zeichen zu scannen?


1. Weg:

Splits die Variablen (nicht gut):

re.compile("[\+\/\-\*]").split(formula) 

['%abc', 'def%', '%hij', 'klm%', '%opq', 'rst%', '%uvw', 'xyz%'] 

2. Weg:

Verliert das% (nicht gut) :

re.compile("%[\+\/\-\*]%").split(formula) 

['%abc-def', 'hij-klm', 'opq+rst', 'uvw-xyz%'] 

Erwartete Ausgabe:

Ich bin für etwas, das nachgeben werde:

['%abc-def%', '%hij-klm%', '%opq+rst%', '%uvw-xyz%'] 

Danke, Dan

+0

Werden jemals andere '%' Zeichen in der Zeichenkette vorkommen oder sind sie nur für Variablen zulässig? –

+0

THey sind nur um Variablen zulässig. – musca999

+0

Wenn Sie zu einer komplexeren Grammatik expandieren möchten, ziehen Sie in Betracht, von Regex zu einem Parsergenerator zu wechseln, wie [Yapps] (http://theory.stanford.edu/~amitp/yapps/) oder [ANTLR] (http: : //www.antlr.org/). –

Antwort

0

können Sie verhindern re.compile("%[\+\/\-\*]%").split(formula) Abfallen die % Zeichen mithilfe von Lookarounds:

re.compile(r"(?<=%)[+/*-](?=%)").split(formula) 

wäre eine andere Lösung auf [+/*-] spalten, sondern nur durch eine gerade Anzahl von % Zeichen folgen, wenn:

re.split(r'[+*/-](?=(?:(?:[^%]*%){2})*$)', formula) 
+0

Genau das, was ich gesucht habe. Ich habe noch nie von dem Lookaround-Begriff gehört. Sehr hilfreich. Vielen Dank. – musca999

+0

Eine kleine Modifikation würde auch die Zeichen behalten, die zum Teilen benutzt wurden: 'r '(? <=%) ([+/* -]) (? =%)" ' – chapelo

0

A 2-Schritt-Lösung:

import re 

tempList = re.split("(\-|\+|\/|\*)(?=%)",'%abc-def%+%hij-klm%/%opq+rst%-%uvw-xyz%') 

finalList = [x for x in tempList if "%" in x] 

['%abc-def%', '%hij-klm%', '%opq+rst%', '%uvw-xyz%'] 

ich diese Hoffnung hilft.