1

Python正規表現を使用して一度に1つの値を解析することができた非常に長いファイルがあります。たとえば、 <h2>タグ間のすべての値を出力するために使用しているコードは次のとおりです。

import os
import re

def query():
    f = open('company.txt', 'r')    
    names = re.findall(r'<h2>(.*?)</h2>', f.read(), re.DOTALL)
    for name in names:
        print name

if __name__=="__main__":
    query()

同じことを繰り返して印刷しarea_codeます。しかし今回は、findall 関数のパターンを置き換えて市外局番を出力するだけです。これは、コードを 2 回実行する必要があることを意味します。

私の質問は、単純に 2 つのクエリを同時に実行し、パイプ (|) で区切られた 1 行に結果を出力する方法はありますか? そのようです:Planner | B21

以下は、解析しようとしている短いサンプル ファイルです。

    <h2>Planner</h2>
    area_place = 'City of Angels';
    area_code = 'B21';
    period = 'Summer';
    ... more content
   <h2>Executive</h2>

    area_place = 'London';
    area_code = 'D33';
    period = 'Winter';
    ...more content
4

1 に答える 1

0

これは、Python 2.7 のテスト データで機能しています。試してみてください。

import os
import re

def query():
    f = open('company.txt', 'r')    
    names = re.findall(r"<h2>(.+?)</h2>.*?area_code = '(.+?)'", f.read(), re.DOTALL)
    for name in names:
        print name[0] + " | " + name[1]

if __name__=="__main__":
    query()

基本的には、両方のクエリを 1 つに組み込み、キャプチャ グループを数値で指定するだけです。私がやっている方法ではあまり意味がないので、「名前」の名前を変更することをお勧めします。

または、既存のクエリを保持したい場合、それらがすべて同じ長さであると想定できる場合は、次のようにすることができます。

names = re.findall(your names regex)
area_codes = re.findall(your area code regex)

for i in range(len(names)):  //very dangerous, if there's one failed match many entries may be mismatched!
    print names[i] + " | " + area_codes[i]  

ただし、データの規則性に非常に自信がある場合を除き、このアプローチはお勧めしません。

于 2013-02-24T20:33:07.550 に答える