2017-10-01 2 views
-1

Ich beginne mit Python.Finden Sie zwei verschiedene Wörter in einer Datei

Hier ist der Text Ich möchte auf Suchen:

vlan 1111 
    name "VLAN1111" 
    untagged 2 
    tagged 10 
    no ip address 
    exit 
vlan 2222 
    name "VLAN2222" 
    untagged 5 
    exit 
vlan 3333 
    name "VLAN3333" 
    untagged 3 
    no ip address 
    exit 

Ich mag würde den gesamten Text "vlan xxxx" suchen. Ich möchte "vlan xxxx" zurückgeben, wenn ich das Wort "unmarkiert" finde, das zwei Zeilen darunter ist.

Mein Code so sein würde:

def find_vlan_untagged(file): 
    vlan = re.findall(r'vlan \d{4}\n\n untagged', file) # Finds VLAN 

    if len(untagged) < 1: 
     return 'No untagged VLAN' 

    else: 
     for each in vlan: 
      return vlan xxxx 

Bitte geben Sie mir zu diesem Thema, ich glaube, ich bin in der Nähe :)

+0

Ihre Regex muss ordnungsgemäß mit der Zeile "name" und mit den Leerzeichen am Anfang der Zeile "untagged" umgehen. Sind diese Sternchen in Ihrer Datendatei? Wenn ja, muss die Regex auch mit ihnen umgehen. –

+0

Danke - Die Sternchen sollten das Wort fett stellen ... In meinen Gedanken würde ich zwei Zeilen nach dem "vlan xxx" überprüfen oder einen Zeilenblock von "vlan xxxx" nach "untagged" extrahieren. Macht das Sinn ? Danke –

Antwort

0

hier ein regulärer Ausdruck ist, das tut, was Sie wollen. Ich habe einen zusätzlichen Eintrag zu den Daten hinzugefügt, damit wir sehen können, dass die Regex einen Eintrag korrekt behandelt, der nicht zu dem Muster passt, nach dem Sie suchen.

Der Schlüssel ist die Angabe des mehrzeiligen Modus-Flags (mit re.M) und die Verwendung nicht-gieriger Übereinstimmung (mit *?). BTW

import re 

data = '''\ 
vlan 1111 
    name "VLAN1111" 
    untagged 2 
    tagged 10 
    no ip address 
    exit 
vlan 2222 
    name "VLAN2222" 
    untagged 5 
    exit 
vlan 4444 
    name "VLAN4444" 
    tagged 44 
    exit 
vlan 3333 
    name "VLAN3333" 
    untagged 3 
    no ip address 
    exit 
''' 

pat = re.compile(r'^(vlan \d{4})\n.*?\n\s*untagged', re.M) 
print(pat.findall(data)) 

Ausgang

['vlan 1111', 'vlan 2222', 'vlan 3333'] 

,

for each in vlan: 
    return vlan xxxx 

nicht tun, was Sie wollen: es von der Funktion auf der ersten Iteration zurück. Ich schlage vor, dass Sie einfach die gesamte Liste, die findet, zurückgeben. Oder Sie könnten die Funktion in eine generator machen, die jedes gefundene Element nacheinander liefert.

+0

Es tut uns leid, dass wir mit einiger Verspätung zurückkommen ... Ihr Code funktioniert wie erwartet :) Vielen Dank für Ihre Hilfe! –

+0

@ArmandChollet Mein Vergnügen! Wenn meine Antwort Ihnen geholfen hat, beachten Sie bitte [akzeptieren] (http://meta.stackexchange.com/a/5235). –

Verwandte Themen