0

一部のテキスト データ (複雑な構造を持つ) を自動的に解析し、それを MySQL データベースに挿入するスクリプトを作成しています。

ファイル名との正規表現の一致に基づいて、ファイルのリストを反復処理する複数の for ループが必要です。最後に、それらを連結してデータベースに挿入します。

ここに私の正規表現があります:

Trgx= re.compile('([a-zA-Z0-9]{3,4})_.*_.*_.*$');
Dtrgx= re.compile('[a-zA-Z0-9]{3,4}_[a-zA-Z0-9]{3,4}_([0-9]{10})_[0-9]{3}'); 
Mrgx= re.compile('.*_([a-zA-Z0-9]{3,4})_.*$'); 
Hrgx= re.compile('.*([0-9]{3}).csv$'); 

ファイル名は次のようになります。

ecd_cdd_2012102100_000.csv
ecd_cdd_2012102100_024.csv
ecd_hdd_2012102200_000.csv
ecd_hdd_2012102200_024.csv
ecd_hdd_2012102200_048.csv
ecd_avgt_2012102200_120.csv
ecd_avgt_2012102200_144.csv
ecd_avgt_2012102200_168.csv
ecd_mint_2012102200_192.csv
ecd_maxt_2012102200_144.csv
ecd_maxt_2012102200_168.csv
ecd_cdd_2012102200_000.csv
ecd_cdd_2012102200_024.csv

各式は、ファイル名のサブセットをキャプチャします。

  • Trgxは最初の部分をキャプチャします (この例ではすべてのインスタンスで「ecd」)。
  • Mrgxは 2 番目の部分 ("cdd"、"hdd"、"avgt" など) をキャプチャします。
  • Dtrgxは日付/時刻セグメントをキャプチャします (2012102100 など)
  • Hrgx は最後の部分 (拡張子の前の 000 や 024 など) をキャプチャします。

すべてのファイル名はすべての正規表現に一致.group(1)しますが、異なる値が入力されます。

正規表現表現を「グループ化」要素として使用してファイルを反復処理し、それらを正しい順序で連結したいと考えています。

このようなもの:

for fileName in fileNameList
    for each distinct value in  Trgx.group(1)
         for each distinct value in  Dtrgx.group(1)
              for each distinct value in Hrgx.group(1)
                     do whatever
4

1 に答える 1

2

正規表現を組み合わせる方が簡単かもしれません

re_fn = re.compile('(?P<T>[a-zA-Z0-9]{3,4})_(?P<M>[a-zA-Z0-9]{3,4})_(?P<Dt>[0-9]{10})_(?P<H>[0-9]{3}).csv')

4 つの正規表現を管理する手間が省けます。

それからあなたはただすることができます

groups = re_fn.match(fileName).groupdict()
# do stuff with groups['T'], groups['M'], groups['Dt'], groups['H']
于 2012-10-23T03:28:15.590 に答える