2017-10-01 18 views
-1

私はPythonを使い始めています。私はすべてのテキスト「のVLAN XXXX」を検索したいファイル内で2つの異なる単語を見つける

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 

:ここ

は、私が上で検索したいテキストです。私は "vlan xxxx"を返したいと思っています。もし私が "untagged"という単語を見つけたら、それは2行下です。

私のコードは次のようになります:

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 

この上で私を教えてください、私は近いと思う:)

+0

あなたのregexは "name"行と "untagged"行の先頭にある空白を正しく扱う必要があります。それらのアスタリスクはあなたのデータファイルにありますか?もしそうなら、正規表現はそれらにも対処する必要があります。 –

+0

ありがとうございました - アスタリスクは太字になっているはずでした...私の考えでは、 "vlan xxx"の後に2行をチェックしたり、 "vlan xxxx"から "untagged"に行のブロックを抽出しました。それは理にかなっていますか?お返事ありがとうございます –

答えて

0

ここで何をしたいん正規表現です。私は正規表現があなたが探しているパターンに合わないエントリを正しく扱うことがわかるように、データに余分なエントリを追加しました。

キーは、マルチラインモードフラグ(re.M)を指定し、貪欲でないマッチング(*?)を使用することです。

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)) 

出力

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

ところで、

for each in vlan: 
    return vlan xxxx 

は、あなたがやりたいことはありません:それは、最初の反復で関数から返されます。 .findallが見つけたリスト全体を返すことをお勧めします。または、関数をそれぞれ見つけたアイテムを1つずつ返すgeneratorにすることもできます。

+0

いくつかの遅れであなたに戻って申し訳ありません...あなたのコードは期待どおりに動作しています:)ありがとうございました! –

+0

@ArmandChollet私の喜び!私の答えがあなたを助けてくれたなら、[受け入れ](http://meta.stackexchange.com/a/5235)と考えてください。 –

関連する問題