2017-12-28 8 views
1

Angenommen, ich ein sympy Ausdruck wie dieses:Ersetzen eines Teils des sympy Ausdruck

x = (1+ r70f * C2H4 *H+ r71* O) 

wo r70f, C2H4, H , r71, O sympy Variablen sind. Ich will es zu dem folgenden Ausdruck ändern:

x = (1+ k(r70f) * c(sC2H4) *c(sH)+ k(r71)* c(sO)) 

Grundsätzlich r_SomeNumber_f zu k(r_SomeNumber_f) ersetzen und ersetzen C2H4 oder H oder O-c(sC2H4) oder c(sH) oder c(sO) ist.

Ich versuche, reguläre Ausdrücke zu verwenden, aber re.sub brauchen str, aber sie sind alle Objekte und das macht Dinge kompliziert !!!

+0

Zeigen Sie genau, wie Sie den Ausdruck ausführen, und versuchen Sie, die Regex anzuwenden. Dein Versuch ergibt überhaupt keinen Sinn wie du es beschreibst. –

+0

Warum werden 'r70f' und' r71' '' '', während 'C2H4',' H' und 'O'' '' 'werden? Was bestimmt, welcher Ersatz vorgenommen werden sollte? – ctwheels

+0

@ctwheels Wenn eine Variable die Form 'r_SomeNumberOrLetter' hat, wird sie k erhalten. Wenn es eine Kombination aus Großbuchstaben und Zahlen oder nur Großbuchstaben ist, wird es "c". – Push

Antwort

1

ich zeigen zwei Möglichkeiten, dies zu tun: ein mit dem Symbol List und das andere mit einem Wrapper-Funktion:

>>> ns={} 
>>> ns["O"] = Symbol("O") 
>>> x = S('1+ r70f * C2H4 *H+ r71* O', locals=ns) 
>>> # Symbol trickery -- changing the name to have parens in it 
>>> print(x.replace(
...  lambda x: re.match('r[0-9]+f', str(x)), 
...  lambda x: Symbol('k(%s)' % str(x)))) 
... 
C2H4*H*k(r70f) + O*r71 + 1 

# function wrapper 
>>> k=Function('k') 
>>> print(x.replace(lambda x: re.match('r[0-9]+f', str(x)), lambda x:k(x))) 
C2H4*H*k(r70f) + O*r71 + 1 

HINWEIS: Sie sagten, dass Sie für k_number_f suchen, aber der Fall von R71 nicht Ende mit einem 'f', damit es nicht geändert wird.

Ich lasse als Erweiterung die Konvertierung der anderen, die mit der "C-Funktion" umwickelt werden.

Verwandte Themen