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?
Antwort
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.
Gute Arbeit. Ich kann mich nicht erinnern, eine bessere Erklärung für positives Look-ahead/Look-back gelesen zu haben. – bernie
>>> 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']
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']
- 1. Python: Text einer Regex-Übereinstimmung erhalten
- 2. Python beautifulsoup Übereinstimmung Regex nach Zeichenfolge
- 3. Finden der kürzesten Regex-Übereinstimmung in Python
- 4. Python Regex passt nicht zu bewiesener Übereinstimmung
- 5. Unterstützt Python bedingte Struktur in Regex?
- 6. RegEx: Kleinste mögliche Übereinstimmung oder nongreedy Übereinstimmung
- 7. Übereinstimmung .jpg Regex
- 8. Regex Übereinstimmung Ausrufezeichen Java
- 9. Bessere Regex-Übereinstimmung?
- 10. Seltsame Regex-Übereinstimmung node.js
- 11. Wie "inverse Übereinstimmung" mit Regex?
- 12. Java regex Übereinstimmung Nummer Muster
- 13. Regex Lookahead eine Übereinstimmung verwerfen
- 14. Exakte Übereinstimmung in regex Charakterklassen
- 15. Regex-Übereinstimmung für XML-Abfragepfade?
- 16. Javascript Regex bedingte Nummer Formatierung
- 17. Python und JSON bedingte Optimierung
- 18. Python String-Übereinstimmung
- 19. Regex - Was wäre Regex für die Übereinstimmung ausländischer Zeichen?
- 20. Regex keine Übereinstimmung separaten Wert und Text
- 21. Case Sensitive teilweise Übereinstimmung mit Boost-regex
- 22. exakte Regex-Übereinstimmung für mehrere Gleichheitszeichen
- 23. Java RegEx gefunden keine Übereinstimmung Fehler
- 24. Java Regex enthält neue Zeile in Übereinstimmung
- 25. Return erste Übereinstimmung von Ruby Regex
- 26. Übereinstimmung von 2 Regex nach bestimmten Kriterien?
- 27. Ignorieren Leerraum für eine Regex-Übereinstimmung
- 28. Übereinstimmung C# Unicode-ID mit Regex
- 29. Übereinstimmung, bis Regex-Ausdruck nicht richtig funktioniert
- 30. Perl regex mehrzeilige Übereinstimmung ohne Punkt
Sie nicht brauchen (+ -)? –
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. –