Seite 1 von 1
Regex Expression um öffnende Klammer zu matchen
Verfasst: Mittwoch 27. Mai 2020, 16:24
von Caliban#
Hallo zusammen, ich bin gerade dabei ein Skript zu schreiben, das Shell commandos parst. Diese sollen aber nur gelesen werden, wenn sie entweder am Anfang der Zeile, mit einigen Leerzeichen oder in einer Subshell vorkommen. Also $(exec ....).
Dazu habe ich den folgenden Ausdruck erzeugt:
Code: Alles auswählen
result = re.match('(^|\W*|\()' + binary_name + ' ', line)
Die Regex matcht gegen die ersten beiden Zeichen, also Zeilenanfang oder Whitespace. Die öffnende Klammer wird aber nicht erkannt. Ich vermute es hat was damit zu tun, dass da ja noch andere Zeichen vor der öffnenden Klammer stehen. Also so eine Zeile wie MAX_CONN =$(expr $CONCNT -1) match hier nicht, da noch andere Zeichen voran stehen.
Vielen Dank vorab.
BR Caliban#
Re: Regex Expression um öffnende Klammer zu matchen
Verfasst: Freitag 29. Mai 2020, 05:00
von snafu
Warum nicht einfach search()? Dann muss man auch nicht den Zeilenanfang beachten. Bei der Funktion gibt es nämlich auch Treffer, wenn das Pattern mitten im Text vorkommt. Auf dein Beispiel gemünzt:
Code: Alles auswählen
text = "MAX_CONN =$(expr $CONCNT -1)"
m = re.search(r"\((.*?)\)", text)
if m:
print(m.group(1))
Re: Regex Expression um öffnende Klammer zu matchen
Verfasst: Freitag 29. Mai 2020, 05:56
von nezzcarth
Hast du mal geschaut, ob shlex vielleicht deine Anforderungen erfüllt?
https://docs.python.org/3/library/shlex.html
Re: Regex Expression um öffnende Klammer zu matchen
Verfasst: Freitag 29. Mai 2020, 06:02
von Sirius3
match matched automatisch am Anfang des Strings. \W sind mehr als Leerzeichen. \s wäre richtig. Man stückelt keine Strings mit + zusammen, sondern nutzt Stringformatierung. Für simple Zeichen braucht es re.escape.
Code: Alles auswählen
result = re.match(f'(\s*|.*\(){re.escape(binary_name)}\s', line)
Einfache Reguläre Ausdrücke sind aber völlig ungeeignet, um Programmcode zu parsen. Der Text könnte in Kommentaren oder Stringliteralen stehen, Klammern escapt oder verschachtelt sein. Ohne einen halbwegs kompletten Parser kommst Du bei shell-Skripten nicht weiter. Oder es ist halt nur wildes Raten.