2017-06-23 11 views
0

おはようございます、私は私を殺している質問があります。 私はスクリプトを使って顧客が私たちに送る文書を傍受しようとしています。 だから私はそれでいくつかのスケジュールでxlsxファイルを生成する必要があります。EDIドキュメントのPython正規表現

これは、文書は次のようになります。

E2EDP10001     300    5  0  02 4M0 035 503 
K C5M    ANTENNE        24       L06S2   CKL   17105098       16.0       20170516            32.0                   2     03                              000006             
E2EDP16001     300    6  5  033D20170609 20170609 24                               
E2EDP16001     300    7  5  033D20170630 20170630 0                               
E2EDP16001     300    8  5  033D20170728 20170728 8                               
E2EDP16001     300    9  5  033I20170731 20170806 8                               
E2EDP16001     300    10 5  033I20170828 20170903 8                               
E2EDP16001     300    11 5  033I20170918 20170924 8                               
E2EDP16001     300    12 5  033I20171016 20171022 8                               
E2EDP16001     300    13 5  033I20171023 20171029 0                               
E2EDP16001     300    14 5  033I20171030 20171105 1 

、これは私がダウンして書いたものです:

import os 
import sys 
import re 
abs_path = os.path.dirname(sys.argv[0]) 

#delfor_folder 
delfor_path = abs_path+r"/DELFOR" 
delfor_archive_path = delfor_path+"/Archive" 
#deljit_folder 
deljit_path = abs_path+r"/DELJIT" 
deljit_archive_path = deljit_path+"/Archive" 
#delins_folder 
delins_path = abs_path+r"/DELINS" 
delins_archive_path = delins_path+"/Archive" 
counter = 0 
#ciclo i delfor 
for file in os.listdir(delfor_archive_path): 
    if os.path.isdir(file): 
     continue 
    elif file.__contains__(".txt"): 
     data = [] 
     #partner = 'unknown' 

     with open(delfor_archive_path+"/"+file) as f_input: 
      for row in f_input: 
       try: 
        data_row = re.match(r'(\d+) +(\d+) +(\d+) +(\d{8}) +(\d{8})', row) 
        continue 
       except: 
        data_row = re.match(r'(\d{3})+I(\d+) +(\d{8}) +(\d+)',row) 

       cliente_row = re.match(r'EDKA1003 +(\d+) +(\d+) +(\w+) +(\w+)', row) 
       materiale_row = re.match(r'EDP10001 +(\d) +(\d+) +(\w+)', row) #TODO togliere i primi due caratteri dell'ultimo gruppo 

       print(cliente_row) 

       ''' 
       if data_row: 
        if data_row.groups()[0]: 
         data.append([partner] + list(data_row.groups()[:-1])) 
        else: 
         partner = data_row.groups()[-1] 
       ''' 

ので、私がしようとしていくつかの疑問をしましたexeptとも私は必要がある場合、可能ですが、コードをうまく機能させるためのアドバイスがあります。 私がする必要がある仕事は〜です。含まれているテーブルを作成 :

E2EDP10001     300    5  0  **02 4M0 035 503** 

< < ** >> 02

E2EDP16001     300    6  5  033D20170609 20170609 24 

2つの日付フォーマットaaaammddと4つの文字の最初のグループのためのexept間のコード(INこの場合、最終的にこの場合033D

、また数量()

私はこれを介してproprerの検索にアドバイスが必要です。 ステートメントや条件がないと、私のコードが動作しています。つまり、1行に1つのre.matchを印刷すると...

アドバイスが役に立ちます。 ありがとう

答えて

1

何をしたいのか分かりませんでした。それは、異なる数の列を持ついくつかの混合表形式のレコードがあるようです。だからsplitの機能をrowに使用し、列のリストを取得します。正規表現は列にのみ使用することも、列の文字列データを分割することもできます。のみNoneを返し、文字列に一致しなかった場合

[['E2EDP10001', '300', '5', '0', '**02 4M0 035 503**'], 
['E2EDP16001', '300', '6', '5', '033D20170609', '20170609', '24'], 
['E2EDP16001', '300', '7', '5', '033D20170630', '20170630', '0'], 
['E2EDP16001', '300', '8', '5', '033D20170728', '20170728', '8'], 
['E2EDP16001', '300', '9', '5', '033I20170731', '20170806', '8'], 
['E2EDP16001', '300', '10', '5', '033I20170828', '20170903', '8'], 
['E2EDP16001', '300', '11', '5', '033I20170918', '20170924', '8'], 
['E2EDP16001', '300', '12', '5', '033I20171016', '20171022', '8'], 
['E2EDP16001', '300', '13', '5', '033I20171023', '20171029', '0'], 
['E2EDP16001', '300', '14', '5', '033I20171030', '20171105', '1']] 

re.matchが例外をスローしません:

data = list() 
with open('data.txt') as f_input: 
    for row in f_input: 
     cols = row.split() 
     if len(cols) == 8: 
      data.append(cols[:4] + ['**' + ' '.join(cols[4:8]) + '**']) 
     elif len(cols) == 7: 
      data.append(cols) 

print str(data).replace('],', '],\n') 

プログラム出力:一部のみ -

は、ここに私のコードです。だから、try ... exceptブロックを使用する意味がありません。

コードを改善する方法がわかっている場合は、私は、あなたはこれを使用し、好きではない:

file.__contains__(".txt")私はこれで置き換えます:file.endswith(".txt")

私はあなたが正規表現で大量のデータを解析する必要がある場合os.path.join(dir1, dir2, ...)

他の事があるとeverytimesがパスに参加しよう、コンパイルされた正規表現を使用する方が良いです。例えば

:あなたは

DATA_ROW_RE = re.compile(r'(\d{3})+I(\d+) +(\d{8}) +(\d+)') 

後であなただけ使用するあなたのスクリプトで定義したスクリプトの初めに

data_row = DATA_ROW_RE.match(row) 
+0

は答えをいただき、ありがとうございます。私は '['4M0 035 503'、 '033D20170609'、 '20170609'、 '24']、['4M0 035 503'、 '033D20170630'、 '20170630'、 '0']、['4M0 035] '033D20170728 '、' 20170728 '、' 8 ']'など... – andrepogg

+0

私はあなたの答えを実装し、テキストバリエーションに達するためにsomoの行を追加するスクリプトを修正しました。そして、喜んで、それは動作します。だから、ありがとう!!!! – andrepogg