2017-07-16 4 views
0

Ich versuche Python Regex zu schreiben. Zuerst habe ich jede Zeile der Datei in eine Liste eingelesen. Dann blättere ich die Liste durch.Python Regex (Lookaround)

Q1. Ich möchte erfassen, wenn die arithmetischen Operatoren haben keinen Raum zwischen them.Something wie

Aufnahme:

a = a+5 

nicht erfasst:

a = a + 5 

Dazu habe ich so etwas wie geschrieben:

for i in array: 

     pattern = re.search(r"\S(\+|\-|\*|\\)\S",i) 

\ S: etwas anderes als Raum

(+ | - | * | \): mathematische Operatoren

\ S: etwas anderes als Raum

Aber das Problem ist, das die Linien erfassen, wo Post Zuwachs Operatoren verwendet werden.

Captures:

a = a++ 

Wie könnte ich einen regulären Ausdruck zu schreiben, so dass er die Linie nicht erfassen, wo Post Schritt Operatoren verwendet werden.

Q2.Ich möchte erfassen, wo mehrzeilige Kommentare in einer Datei verwendet werden.

Ich habe versucht, indem ich den folgenden Ausdruck, aber es ist nicht zu erfassen.Ich weiß nicht, wo ich falsch gemacht habe.Klindlich helfen.

for i in array: 

     pattern = re.search(r"\/\*[A-Za-z0-9_]\*\/",i) 

Antwort

0

Für Frage 1 möchten Sie ein Plus, dem kein Leerzeichen oder ein Plus vorangestellt ist, gefolgt von einem Leerzeichen oder einem Pluszeichen. Dies kann geschrieben werden:

r"(?<![+\s])[+](?![+\s])" 

Sie können den gleichen Ausdruck mit Minus statt Plus, oder Stern oder Schrägstrich tun. Dann verbinden Sie diese Ausdrücke mit dem | Zeichen.

Zu Frage 2 können Sie

r"[/][*](?:[^*]|[*](?![/]))*[*][/]" 

Natürlich versuchen Sie es nicht verschachtelte mehrzeilige Kommentare zu behandeln. Für diese reicht eine einfache Regex nicht aus.

0

Das erste Problem kann mit Hilfe von negierten Zeichenklassen gelöst werden, zumindest für die aktuellen Beispielzeichenfolgen und vielleicht einige weitere Fälle. Das Problem, das Sie angezeigt haben, ist aufgrund der Tatsache, dass \S mit einem Nicht-Leerzeichen passt. Verwenden Sie [^\s+*/()-] negierte Zeichenklasse, um beliebige Zeichen zu entsprechen, die nicht Leerzeichen sind, -, /, + und *, und vielleicht sogar ( und ).Ihre erste Regex - beachten Sie, dass Divisionsoperator / sein sollte, nicht \ - als

pat = r"[^\s+*/()-]([+*/-])[^\s+*/()-]" 

die regex demo

Die zweite Siehe geschrieben ist ein gelöstes Problem.

pat = r"/\*[^*]*\*+(?:[^/*][^*]*\*+)*/"; 

Siehe regex demo.

Einzelheiten

  • /\* - Kommentar starten
  • [^*]*\*+ - Spiel 0+ andere Zeichen als * gefolgt mit 1+ wörtlichen *
  • (?:[^/*][^*]*\*+)* - 0+ Sequenzen:
    • [^/*][^*]*\*+ - kein / oder * (in Verbindung mit [^/*]) und anschließend mit 0+ nicht-Stern-Zeichen ([^*]*) und anschließend mit 1+ Sternchen (\*+)
  • / - /
Schließen