0

これが簡単な問題であることを願っています:

これが私の辞書ですtemp = {'0.1995': ['in1', 'in2'], '0.399': ['in0', 'y']})

ファイルを検索するコード:

for line in SPFFile:
    temp_dict = temp            
    for val in temp_dict.itervalues():      
    if re.search(val.upper(),line) and ((re.search("^R",line) or re.search("^C",line))):
         print "value found!"

私の問題は、valが['in1'、'in2']のようなリストであるのに対し、valは'in1'、'in2'などである必要があるということです。

また、これを行うために辞書を使用するべきではない場合は、私に知らせてください。辞書は2つのリストから構成されました。

4

2 に答える 2

2

内部forループを次のように変更します。

for key, vals in temp_dict.items():
    if re.search('|'.join(vals)):
        #do stuff here

そもそも辞書の使用に関しては、上記のようにキーを介して値を整理する必要があるかどうかによって異なります。特定の行に値が存在するかどうかを確認するだけの場合は、'|'.join()すべての値をまとめて、結果の文字列を検索式として使用する方がよい場合があります。

于 2013-01-15T04:55:59.890 に答える
2
  • 読みやすさとパフォーマンスのトレードオフは確かに可能ですが、3つではなく1つの正規表現を使用してみてください。したがって、たとえば:

    if re.match('[RC].*(?:%s)' % '|'.join(map(re.escape, val), line):
        print "value found!"
    

    val'R'または'C'が一致させようとしているアイテムの一部ではないと仮定すると、上記で説明したことを1つのステップで実行します。そうである場合は、代わりに先読みを使用できます。

    if re.match('(?=.*%s)[RC]' % '|'.join(map(re.escape, val), line):
        print "value found!"
    
  • temp_dict = temptemp後でどこかに再割り当てする予定がない限り、何もしません。temp新しい名前の内容を与えるだけです。tempまた、変数にやよりも意味のある名前を付けることを検討することもできますval

  • モジュールには正規表現キャッシュが組み込まれていreますが、パフォーマンスが大幅に向上するため、繰り返し使用する正規表現をコンパイルする習慣を身に付ける必要があります。これは私のスタイルですが、冗長すぎる可能性があります。

    RE_BEGINS_WITH_R_OR_C = re.compile('^[RC]')
    

    もちろん、ループ全体で毎回新しい正規表現を使用している場合、それを行う意味はありません...しかし、上記のコードのように、アイテムが一致することだけを気にし、どのアイテムが一致するかを気にしない場合この答えを使用してリストのリストをフラット化することができ(ネストされたリスト内包構文は混乱します、私は議論するつもりはありません:-)、単一の正規表現をコンパイルし、ファイルのすべての行にそれを使用ます。

  • との違いにre.match注意re.searchしてください。re.searchを使用できる場合は、アンカーする必要はありませんre.match

一般的に、ドキュメントを読んでください!悪くない!使用しているPythonのビット(文字列、リスト、辞書、正規表現)を確認することから始めることができます。

于 2013-01-15T05:02:23.167 に答える