1

3 行以上にわたって関心のある情報を含むファイルからレコードを抽出しています。情報は順番に並んでおり、妥当なパターンに従いますが、間にボイラープレート テキストを含めることができます。

これは PDF から変換されたテキスト ファイルであるため、間にページ番号やその他の単純な制御要素が含まれている可能性もあります。

パターンの構成: 開始行: 姓と名をカンマで区切り、それ以外は何もない
次の行には 2 つの長い数字 (>=7 桁) と 2 つの日付が続きます 対象
の最後の行には 4 桁の数字と日付が続きます

対象のパターンは太字でマークされています):

姓、名
...何もないか、おそらくジャンクテキスト
   999999999 9999999 MM/DD/YY MM/DD/YY   ジャンク テキスト
...何もないか、おそらくジャンクテキスト
   9999 MM/DD/YY   ジャンク
私は気にしない

私のターゲットテキストは、デフォルトで次のようになります。

無関係なテキスト 
DOE,JOHN 
             200000002 100000070 04/04/13 12/12/12   XYZ IJK ABC SOMETHING SOMETHING  
              0999 12/22/12     0 1 0 SOMETHING ELSE
その他の何か

ただし、その間に何かが発生する可能性があるため、次のようになります。

いくつかの無関係なテキスト 
DOE、ジョン
13ページ ヘッダー
             200000002 100000070 04/04/13 12/12/12   XYZ IJK ABC  
             何か 何か 0999 12/22/12     0 1 0何か他
その他の何か

ここではあまり検証する必要がないので、次の正規表現で 3 行をキャッチしています。

このパターンは部分文字列として発生することがわかっているため、挿入の可能性があります

これまでのところ、次の 3 つの reg でこれらの要素をキャッチしてきました。式:

(([A-Z]+\s+)+,[A-Z]+)
(\d{7,}\s+\d{7,}\s+(\d{2}/\d{2}/\d{2}\s+){2})
(\d{4}\s+\d{2}/\d{2}/\d{2})

しかし、関心のあるデータ全体を抽出したいと思います。

それは可能ですか?

4

2 に答える 2

0

ここでは、リストに正規表現を追加し、次々と一致するものを見つけようとしました...これはあなたが探していたものですか??

import re

f = open("C:\\Users\\mridulp\\Desktop\\temp\\file1.txt")
regexpList = [re.compile("(([A-Z]+\s+)+,[A-Z]+)"),
              re.compile("^.*(\d{7,}\s+\d{7,}\s+(\d{2}/\d{2}/\d{2}\s+){2})"),
              re.compile("^.*(\d{4}\s+\d{2}/\d{2}/\d{2}).*")]
lines = f.readlines()
i = 0
for l in lines:
    mObj = regexpList[i].match(l)
    if mObj:
        print mObj.group(1)
        i = i + 1
    if i > 2:
        i = 0

f.close()
于 2013-07-03T02:34:25.017 に答える
0

これにより、より大きな文字列から目的の部分文字列のすべてのインスタンスが取得されます。

re.findall('([A-Z]+\s+,[A-Z]+).+?(\d+\s+\d+\s+\d{2}\/\d{2}\/\d{2}\s+\d{2}\/\d{2}\/\d{2}).+?(\d+\s+\d{2}\/\d{2}\/\d{2})', x, re.S)

結果として得られるタプルのリストは、不要なテキストが削除された目的の部分文字列のリストを取得するために必要に応じてつなぎ合わせることができます。

于 2013-07-03T03:01:17.813 に答える