2011-04-06 8 views
0

テキストファイルからSQLデータベースに大量のビルディングコードをインポートする必要があります。これまでは、コード番号とタイトルを正常に返す次のコードを書いています。コードのタイトルの後のテキストを次のコードの先頭にどのように一致させることができますか?正規表現を使用して大量のデータをインポートする

Test.txt:

101.1タイトル。これはサンプルコードです。

101.1.2ローカル料金。地方の管轄区域では、第300.1項に基づく建築許可証 違反の料金を請求することがあります。

import re 

file=open(r'C:\Test.txt','r') 
text=file.read() 

codes=re.findall('(\d{3,4}.[\d.]+?){1}\s([\w\s]+[.]){1}',text) 
for code in codes: 
    print code[0],code[1] 

これは、その結果:

101.1タイトル。 私はコード[3] print 'これはサンプルコードです。'を持っています。

101.1.2ローカル料金。

答えて

3

re.findallの代わりにre.splitを使用してください。あなたの場合:

>>> re.split('(\d{3,4}.[\d.]+?){1}\s([\w\s]+[.]){1}',text) 

['', '101.1', 'Title.', ' This is an example code.\n\n', '101.1.2', 'Local Fees.', ' The local jurisdiction may charge fees for building permit violations per Section 300.1.\n'] 
0

あなたのレコードのタイトルは、最後の数字(文字列の文字を増やしている場合)と数字の前に1つもついていない最初のピリオドの間のテキストです。

これを使用すると、レコードの2つの部分を区切るピリオドの位置を決定し、それに基づいて分割することができます。次に、2つの文字列をペアとしてキャッシュするか、データベースに完全に挿入します。

ファイルが抽出したい建物コードであり、使用していないデータが含まれていない場合は、正規表現を破棄してこの方法を使用することをおすすめします。

0

私は{1}はあなたのtest.txtに対して役に立たない

0
import sys 
import re 

SECTION = r'\d{3,4}\.[\d.]*' 
LABEL = r'[^.\r\n]*' 
TITLE = re.compile(r'^({section})\s*({label})\W*'.format(section=SECTION, label=LABEL), re.MULTILINE) 

def process(fname): 
    with open(fname, 'r') as inf: 
     txt = inf.read() 
    res = TITLE.split(txt) 
    it = iter(res) 
    it.next()   # discard leading text 
    return zip(it, it, it) 

def main(): 
    args = sys.argv[1:] or ['c:/test.txt'] 
    for fname in args: 
     res = process(fname) 
     # do something with res 

if __name__=="__main__": 
    main() 

を実行していること(テストしていません)folowing

codes=re.findall('^(\d{3,4}.[\d.]+?)\s([\w\s]+[.])\s+(.*)$',text,re.MULTILINE) 

注、このリターンを使用します

[ 
    ('101.1', 'Title', 'This is an example code.\n\n'), 
    ('101.1.2', 'Local Fees', 'The local jurisdiction may charge fees for building permit violations per Section 300.1.\n\n') 
] 
関連する問題