2016-06-16 10 views
1

リストに結果を追加しようとしていますが、一致するものが見つからなければリストに文字列 "N/A"を追加します。 show_version_listsは、さまざまなネットワークデバイスからのログのリストです。Python Regex:見つかった場合は文字列を追加し、それ以外の場合は "Not Found"を追加する方法は?

上記のコードを実行すると、else条件は発生しません。

Load for five secs: 5%/0%; one minute: 4%; five minutes: 4% 
Time source is NTP, 15:24:47.756 PDT Thu Jun 16 2016 
Cisco IOS XE Software, Version 03.16.01a.S - Extended Support Release 
Cisco IOS Software, ASR1000 Software (PPC_LINUX_IOSD-ADVENTERPRISEK9-M), Version 15.5(3)S1a, RELEASE SOFTWARE (fc1) 
Technical Support: http://www.cisco.com/techsupport 
Copyright (c) 1986-2015 by Cisco Systems, Inc. 
Compiled Wed 04-Nov-15 17:40 by mcpre 

に一致していなければならないログの一の実施例と一致している必要があり、ログの一方のアン例。

Cisco IOS Software, C3750E Software (C3750E-UNIVERSALK9-M), Version 15.2(2)E3, RELEASE SOFTWARE (fc3) 
Technical Support: http://www.cisco.com/techsupport 
Copyright (c) 1986-2015 by Cisco Systems, Inc. 
Compiled Wed 26-Aug-15 06:14 by prod_rel_team 

編集:

AChampionあなたは右のループは、ロジックの問題を修正するために取り出しました。

+0

あなたの 're.findall()'呼び出しは一致を返すのみで、最初の一致のみをスライスするので、 're.search()'は常にTrueになります。サンプルデータを共有できますか?あなたは 'for'ループと' re.search() 'を取り除き、' re.match() 'を使用したいかもしれません – AChampion

+0

re.findallとre.searchがコード内で全く同じであるため、 – dmitryro

答えて

1

re.finditerを使用してください。

finditerは一致オブジェクトを返し、re.groupを使用して一致オブジェクトのバージョン情報を追加できます。それはこれほど簡単です。

import re 

version_numbers_xe = [] 

for result in show_version_list: 
    found = False 
    for match in re.finditer(r'(?<=Version).*?(?=-)',result): 
     version_numbers_xe.append(match.group()) 
     found = True 
    if not found: 
     version_numbers_xe.append(None) 

私はパフォーマンス上の理由から、製品に、あなたの正規表現をプリコンパイルし、次のをお勧めします:

import re 

version_numbers_xe = [] 
version_regex = re.compile(r'(?<=Version).*?(?=-)') 

for result in show_version_list: 
    found = False 
    for match in version_regex.finditer(result): 
     version_numbers_xe.append(match.group()) 
     found = True 
    if not found: 
     version_numbers_xe.append(None) 

これが最後の試合のために整合性チェックを取り除きますが、私はよく分かりませんなぜあなたはそれを最初に持っていたのですか?

+0

あなたの答えをありがとう、正規表現をコンパイルするのは良い追加です! –

+0

@JClark Finditerはまた、後にマッチグループを扱う必要がある場合にfindallを使うよりも優れています。特にマッチグループの文脈を見たいと思ったら、findallではなくfinditerを使うことがよくあります。 –

1

問題はあなたのコードロジックにあります。あなたのコードは、基本的に次のことを言っている:あなたはmatchedtext で正規表現の結果を見つける常にのために

*あなたが同じ正規表現の結果を見つけた場合 X行う*そうでない場合は(あなたは常にされます)ので、yが起こることはありません(Yを行います一例として)

、のようなものにロジックを変更する:あなたは正規表現結果プリントxを見つけた場合 「 matchedtextのソース」内のすべてのデータのために 、 他の印刷「N /」

関連する問題