2016-08-26 2 views
2

のために、私は設定ファイルを検索し、次のように別のリストからすべての文字列の一致が見つかったスクリプトがあります。正規表現は、リストの要素の上にループ

dstn_dir = "C:/xxxxxx/foobar" 
dst_list =[] 
files = [fn for fn in os.listdir(dstn_dir)if fn.endswith('txt')] 
dst_list = [] 
for file in files: 
    parse = CiscoConfParse(dstn_dir+'/'+file) 
    for sfarm in search_str: 
     int_objs = parse.find_all_children(sfarm) 
     if len(int_objs) > 0: 
      dst_list.append(["\n","#" *40,file + " " + sfarm,"#" *40]) 
      dst_list.append(int_objs) 

私はこのコードの一部を変更する必要があります。

for sfarm in search_str: 
      int_objs = parse.find_all_children(sfarm) 

search_strは、['xrout:55','old:23']など多くの文字列を含むリストです。

したがって、リストからの文字列で終わるエントリは、sfarmで繰り返されます。私が理解するには、reを使用してsfarm$のようなものにマッチさせる必要がありますが、ループの一部としてこれを行う方法はわかりません。

sfarmは繰り返し可能ですか?もしそうなら、私はこのコンテキストで反復可能なオブジェクトを正規表現する方法を知る必要があります。

+1

あなたはsearch_str' 'の定義を含めるのを忘れて、それは' sfarm'が何であるかを言うのは難しいです。言い換えれば、[最小限で完全で検証可能なサンプルを作成する方法](http://stackoverflow.com/help/mcve)を参照してください。 –

+0

'search_str'は反復可能で、' sfarm'は正規表現を使うことができるあなたのリストの普通の要素です( – Julien

+0

)。IIja Everilaと私はsearch_strがどのように埋め込まれるのか知りたいですか?さらに、search_strとなるサンプルデータを追加できると良いでしょう。 –

答えて

2

Pythonの文字列は反復可能なので、sfarmは反復可能ですが、この場合はほとんど意味がありません。 CiscoConfParse.find_all_children()の内容を読むと、sfarmlinespecであることが明らかです。これは正規表現の文字列です。ここでreモジュールを明示的に使用する必要はありません。ただ渡すsfarm'$'と連結:

search_string = ['xrout:55','old:23'] 
... 
for sfarm in search_str: 
    int_objs = parse.find_all_children(sfarm + '$') # one of many ways to concat 
... 
+0

レッスンと簡単な効果的なソリューションをありがとう。私はこれを答えとして受け入れました – ade1e

1

このコードを確認してください。 globモジュールを使用して、フォルダ内のすべての "* .txt"ファイルを取得します。

glob moduleの詳細については、こちらをご覧ください。

import glob 
import re 
dst_list = [] 
search_str = ['xrout:55','old:23'] 
for file_name in glob.glob(r'C:/Users/dinesh_pundkar\Desktop/*.txt'): 
    with open(file_name,'r') as f: 
     text = f.read() 
     for sfarm in search_str: 
      regex = re.compile('%s$'%sfarm) 
      int_objs = regex.findall(text) 
      if len(int_objs) > 0: 
       dst_list.append(["\n","#" *40,file_name + " " + sfarm,"#" *40]) 
       dst_list.append(int_objs) 
print dst_list 

出力:

C:\Users\dinesh_pundkar\Desktop>python a.py 
[['\n', '########################################', 'C:/Users/dinesh_pundkar\\De 
sktop\\out.txt old:23', '########################################'], ['old:23']] 

C:\Users\dinesh_pundkar\Desktop> 
+1

グロブを使用するための提案として、この回答をマークしています。ありがとう – ade1e