2009-05-30 25 views
0

Ich weiß nicht, ob das das richtige Wort dafür ist, aber ich versuche, einige Regex zu finden, die Koeffizienten und Exponenten aus einem mathematischen Ausdruck extrahieren können. Der Ausdruck kommt in der Form 'axB + cxD + exF', wobei die Kleinbuchstaben die Koeffizienten und die Großbuchstaben die Exponenten sind. Ich habe eine Regex, die mit beiden übereinstimmen kann, aber ich frage mich, ob ich 2 Regexs verwenden kann, eines für die Koeffizienten und eins für die Exponenten. Gibt es eine Möglichkeit, eine Zahl mit einem Buchstaben auf einer Seite zu vergleichen, ohne den Buchstaben zu finden? ZB, in '3x3 + 6x2 + 2x1 + 8x0' brauche ich ['3', '6', '2', '8'] und ['3', '2', '1', ‚0‘]Python Regex - bedingte Übereinstimmung?

+0

Sie nicht brauchen (+ -)? –

+0

Ich bin nur die Zeichen zu den Koeffizienten hinzugefügt ... Wenn es ein + gibt dann ignoriere ich es, und der Koeffizient direkt daneben ist positiv. Wenn es ein gibt - dann nehme ich es auf, indem ich einfach ein - * vor dem \ d hinzufüge, es funktioniert ganz gut. –

Antwort

5

können Sie positive look-ahead verwenden, um etwas zu entsprechen, die durch etwas anderes folgt. Um die Koeffizienten übereinstimmen, können Sie verwenden:

>>> s = '3x3+6x2+2x1+8x0' 
>>> re.findall(r'\d+(?=x)', s) 
['3', '6', '2', '8'] 

Aus der Dokumentation des re Modul:

(? = ...) Spiele, wenn ... übereinstimmt nächsten, aber nicht Verzichte auf die Zeichenfolge. Dies wird als Lookahead Assertion bezeichnet. Zum Beispiel wird Isaac (? = Asimov) 'Isaac' nur übereinstimmen, wenn es von 'Asimov' gefolgt wird.

Für die Exponenten können Sie positive look-behind statt:

>>> s = '3x3+6x2+2x1+8x0' 
>>> re.findall(r'(?<=x)\d+', s) 
['3', '2', '1', '0'] 

Wieder aus der Dokumentation:

(? < = ...) Spiele, wenn die aktuelle Position in der Der Zeichenfolge wird eine Übereinstimmung für ... vorangestellt, die an der aktuellen Position endet. Dies wird als positive Lookbehind Assertion bezeichnet. (? < = abc) def findet eine Übereinstimmung in abcdef, da das Lookbehind 3 Zeichen sichert und überprüft, ob das enthaltene Muster übereinstimmt.

+0

Gute Arbeit. Ich kann mich nicht erinnern, eine bessere Erklärung für positives Look-ahead/Look-back gelesen zu haben. – bernie

1
>>> import re 
>>> equation = '3x3+6x2+2x1+8x0' 
>>> re.findall(r'x([0-9]+)', equation) 
['3', '2', '1', '0'] 
>>> re.findall(r'([0-9]+)x', equation) 
['3', '6', '2', '8'] 
1

Noch ein anderer Weg, es zu tun, ohne regex:

>>> eq = '3x3+6x2+2x1+8x0' 
>>> op = eq.split('+') 
['3x3', '6x2', '2x1', '8x0'] 
>>> [o.split('x')[0] for o in op] 
['3', '6', '2', '8'] 
>>> [o.split('x')[1] for o in op] 
['3', '2', '1', '0'] 
Verwandte Themen