Regex Expression um öffnende Klammer zu matchen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Caliban#
User
Beiträge: 1
Registriert: Mittwoch 27. Mai 2020, 15:41

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#
Benutzeravatar
snafu
User
Beiträge: 6867
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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))
nezzcarth
User
Beiträge: 1764
Registriert: Samstag 16. April 2011, 12:47

Hast du mal geschaut, ob shlex vielleicht deine Anforderungen erfüllt? https://docs.python.org/3/library/shlex.html
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

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.
Antworten