2017-03-16 5 views
2

Ich habe ein Problem mit Regex in meinem Python-Skript, ich habe es nie wirklich ehrlich verstanden und finde es immer noch verwirrend, aber ich denke, in diesem Fall brauche ich es. Hier ist mein Problem.Python Regex Pattern Beratung

Unten ist der Ausgang I als String gespeichert habe:

cd /dev;ls | grep st 
[[email protected] ~]# cd /dev;ls | grep st 
nst0 
nst0a 
nst0l 
nst0m 
st0 
st0a 
st0l 
st0m 
stderr 
stdin 
stdout 
vhost-net 
[[email protected] dev]# 

Aus dieser Saite, die ich zu identifizieren versuchen und speichern „ST0“ auf eine Variable später verwendet werden, jedoch kann es mehr Ergebnisse sein als nur st0, die gefunden werden müssen. Die Nummer wird automatisch erzeugt, wenn ein neues Gerät an den Server angeschlossen wird (daher könnte st0, st1, st2 unendlich sein und ich möchte alle Ergebnisse in einem Tupel speichern)

Kann mir jemand sagen, was für ein Regex-Muster ich habe sollte verwenden, um "st" als die ersten zwei Zeichen zu identifizieren und die nachfolgenden Zahlen danach zu erhalten?

Dank

+0

Also, was Sie versucht haben? Was meinst du mit "die ersten zwei Zeichen"? Woher? –

+0

Mit den ersten beiden Zeichen meine ich "st" und durch was ich meine in der Ausgabe string habe ich kopiert und eingefügt. Ich habe versucht, re.findall (r '\ bst \ b', Ausgabe), die ['st', 'st'] zurückgibt, aber ich weiß nicht, wie man die zwei Zeichen danach – Tolki

+0

Verwenden Sie 're.findall (r '\ bst \ d + \ b ', Ausgabe) '. Wenn Sie das 'st \ d +' als ganze Zeile cotntent meinen, verwenden Sie 're.findall (r '(? M)^st \ d + $', Ausgabe)' –

Antwort

0

Sie eine der beiden folgenden Lösungen verwenden:

re.findall(r'\bst\d+\b',output) 

Siehe regex demo. Hier passt \bst\d+\bst + eine oder mehrere Ziffern zwischen Wortgrenzen (zwischen dem Anfang/Ende eines Strings oder Nicht-Wort-Zeichen).

Oder, wenn Sie die st\d+ bedeuten eine ganze Linie sein sollte, verwenden

re.findall(r'(?m)^st\d+$',output) 

this regex demo See. Hier wird st\d+ nur als ganze Zeile aufgrund ^ und $ Anker (die Linie Grenzen entsprechen aufgrund der , Inline re.MULTILINE Modifikator Option) abgestimmt.

Python demo:

import re 

reg = r"\bst\d+\b" 
s = "Last login: Thu Mar 16 23:04:57 2017 from 16.29.4.112\ncd /dev;ls | grep st\n[[email protected] ~]# cd /dev;ls | grep st\nnst0\nnst0a\nnst0l\nnst0m\nst0\nst1\nst0a\nst0l\nst0m\nstderr\nstdin\nstdout \nvhost-net\n[[email protected] dev]#" 
res = re.findall(reg, s) 
print(res) 
# => ['st0', 'st1'] 
+0

Leider keine der beiden Instanzen funktioniert Ich habe sogar versucht, re.findall (r '\ bst0 \ b', Ausgabe) In dem Versuch, das Wort innerhalb der Zeichenfolge genau zu finden und auch das nicht t alles zurückgeben – Tolki

+0

Dann unterscheidet sich Ihre Eingabe von der, die Sie gepostet haben. Oder du hast meinen Code nicht einmal probiert. –

+0

Der String Im Suche: cd/dev; ls | grep st [root @ modi ~] # cd/dev; ls | grep st nst0 nst0a nst0l nst0m st0 st0a st0l st0m Stderr stdin stdout vhost-net [root @ modi dev] # – Tolki