2017-11-14 1 views
2

Ich habe einen Bot, der eine Reihe von verschiedenen Befehlen übernimmt und ich versuche skalieren seine Fähigkeit, Argumente für alle diese Befehle zu nehmen.Regex Infitine Capture-Gruppen nach einer bestimmten Zeichenfolge

Dies ist die Syntax:

!action db_table mandatory_arg arg1 arg2 arg3... 

Im Moment habe ich diese funktional, aber un-skalierbare regex für die Verarbeitung von Befehlen:

^!(\S*)\s?(\S*)\s?(\S*)\s?(\S*)\s?(\S*)\s?(\S*)\s?(\S*)\s?(\S*)$ 

Es funktioniert, aber es ist nicht so toll und es ist offensichtlich begrenzt auf Wieviele \ S * füge ich da rein.

Also wie kann ich eine unbegrenzte Anzahl von Argumenten in der folgenden Zeichenfolge übereinstimmen?

Ich habe versucht, einen Lookbehind zu verwenden, aber es funktioniert nur für das erste Spiel. Ich habe auch versucht, den ersten Teil vollständig zu machen, aber das funktioniert nur für das erste Argument, da die anderen auch nach dem spezifischen Ignorieren suchen.

Schließlich gab ich auch \ K eine Aufnahme, aber es hat nicht geklappt.

+0

Warum nicht '.split()'? – Jan

+0

Verwenden Sie die PyPi Regex-Bibliothek? –

+0

Regex kann keine unbegrenzte Anzahl von Strings erfassen. Warum teilst du deine Zeichenfolge nicht einfach in Leerzeichen? –

Antwort

3

Sie scheinen Leerzeichen getrennte Argumente nach einem bestimmten Muster vom Anfang einer Zeichenfolge zu greifen. Sie können alle 1+ Zeichen nach diesem Muster erfassen, führen Sie eine re.search/re.match, um diesen Wert zu greifen, und sobald eine Übereinstimmung gefunden wird, nur split() die match.group(1).

Der reguläre Ausdruck wird sich herausstellen

^!\w+\s+\w+\s+\w+(.+) 

Oder, um es etwas zu verkürzen:

^!(?:\w+\s+){3}(.+) 

anzumerken, dass ^ wird zu Beginn in re.match wo das Muster redundant sein verankert ist aus die Zeichenfolge standardmäßig. Siehe regex demo.

Siehe Python demo:

import re 
rx = r"!\w+\s+\w+\s+\w+(.+)" 
s = "!action db_table mandatory_arg arg1 arg2 arg3" 
m = re.match(rx, s) 
if m: 
    print(m.group(1).split()) 
# => ['arg1', 'arg2', 'arg3'] 
+0

Das ist gut. Ich lerne immer noch Regex, und ich hatte gehofft, dass alles in einer einzigen Suche funktioniert, ohne Python danach zu benutzen, aber ich nehme deine Antwort. – Quake

+0

@Quake Wenn Sie das PyPi Regex Modul installieren, können Sie alles mit 1 Regex machen, siehe [** diese Demo **] (http://rextester.com/AAWW31809).Wenn meine Antwort am besten für Sie funktioniert, denken Sie bitte daran, die Antwort zu akzeptieren. –

+0

Wie akzeptiere ich Ihre Antwort? – Quake

1

Eigentlich gibt es keine regulären Ausdruck hier gebraucht, nur split() verwenden:

cmds = ['!action db_table mandatory_arg arg1 arg2 arg3...', 
     '!dont match this match1 match2 match3 match4 etc...', 
     'this one not'] 

new_cmds = [args[3:] 
      for cmd in cmds 
      for args in [cmd.split()] 
      if cmd.startswith('!')] 

print(new_cmds) 
# [['arg1', 'arg2', 'arg3...'], 
# ['match1', 'match2', 'match3', 'match4', 'etc...']] 
Verwandte Themen