2011-04-06 5 views
0

텍스트 파일에서 SQL 데이터베이스로 많은 양의 건물 코드를 가져와야합니다. 지금까지 코드 번호와 제목을 성공적으로 반환하는 다음 코드를 작성했습니다. 코드 제목 뒤에 나오는 텍스트를 다음 코드 시작 부분과 어떻게 일치시킬 수 있습니까?정규식을 사용하여 많은 양의 데이터 가져 오기

Test.txt :

101.1 제목. 이것은 예제 코드입니다.

101.1.2 지역 수수료. 해당 지역의 관할 구역은 섹션 300.1에 따라 건축 허가 위반에 대한 수수료를 부과 할 수 있습니다.

101.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] 

이 발생합니다. 나는 코드를 갖고 싶습니다. [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

귀하의 레코드 제목은 마지막 숫자 (문자열을 증가시킬 경우)와 첫 번째 마침표가 숫자 앞에 나오지 않고 첫 번째 마침표 사이에있는 텍스트입니다.

이것을 사용하면 전체 줄을 가져 와서 레코드의 두 부분을 구분하고 그 부분을 기준으로 분할 할 수 있습니다. 그런 다음 두 문자열을 쌍으로 캐시하거나 데이터베이스에 직접 삽입하십시오.

파일이 추출하려는 건물 코드이고 사용하지 않는 데이터가없는 경우 정규식을 폐기하고이 방법을 사용하는 것이 좋습니다.

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() 

실행이라고

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

주,이 반환 folowing을 사용합니다 : 귀하의 경우에는

[ 
    ('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') 
] 
관련 문제