2013-06-26 2 views
1

내가 헤더 내부 규칙적인 구조로 로그 파일에서 BCF 번호, BTS # 및 LAC, CI를 얻을 수 re.split을 시도하고있다 :파이썬 re.split에 내다 패턴

: 코드

================================================================================== 
RADIO NETWORK CONFIGURATION IN BSC: 
                 E P B 
             F     T R C D-CHANNEL BUSY 
         AD OP   R ET- BCCH/CBCH/ R E S O&M LINK HR FR 
LAC CI   HOP ST STATE FREQ T PCM ERACH  X F U NAME ST 
                     /GP 
===================== == ====== ==== == ==== =========== = = == ===== == === === 

BCF-0010 FLEXI MULTI U WO         2 LM10 WO 
10090 31335 BTS-0010 U WO            0 0 
KHAKHAATT070D BB/- 
                       7 
       TRX-001 U WO  779 0 1348 MBCCH+CBCH P 0 
       TRX-002 U WO  659 0 1348     1 
       TRX-003 U WO  661 0 1348     2 
       TRX-004 U WO  670 0 1348     0 
       TRX-005 U WO  674 0 1348     1 
10090 31336 BTS-0011 U WO            0 0 
KHAKHAATT200D BB/- 
                       7 
       TRX-006 U WO  811 0 1348 MBCCH+CBCH P 2 
       TRX-009 U WO  845 0 1349     2 
       TRX-010 U WO  819 0 1349     0 
       TRX-011 U WO  823 0 1349     1 
       TRX-012 U WO  836 0 1349     2 
10090 31337 BTS-0012 U WO            0 0 
KHAKHAATT340D BB/- 
                       5 
       TRX-013 U WO  799 0 1349 MBCCH+CBCH P 0 
       TRX-014 U WO  829 0 1349     1 
       TRX-017 U WO  831 0 1302     2 
       TRX-018 U WO  834 0 1302     1 
       TRX-019 U WO  853 0 1302     0 
       TRX-020 U WO  858 0 1302     2 
       TRX-021 U WO  861 0 1302     1 

BCF-0020 FLEXI MULTI U WO         0 LM20 WO 
10090 30341 BTS-0020 U WO            0 0 
KHAKHABYT100G BB/- 
                       1 
       TRX-001 U WO  14 0 1856 MBCCH+CBCH P 0 
       TRX-002 U WO  85 0 1856     1 
10090 30342 BTS-0021 U WO            0 0 
KHAKHABYT230G BB/- 
                       1 
       TRX-003 U WO  4 0 1856 MBCCH+CBCH P 2 
       TRX-004 U WO  12 0 1856     0 
10090 30343 BTS-0022 U WO            0 0 
KHAKHABYT340G BB/- 
                       1 
       TRX-005 U WO  20 0 1856 MBCCH+CBCH P 1 
       TRX-006 U WO  22 0 1856     2 
10090 30345 BTS-0025 U WO            0 0 
KHAKHABYT100D BB/- 
                       5 
       TRX-007 U WO  793 0 1856 MBCCH+CBCH P 0 
       TRX-008 U WO  851 0 1856     1 
       TRX-009 U WO  834 0 1857     2 
       TRX-010 U WO  825 0 1857     1 
10090 30346 BTS-0026 U WO            0 0 
KHAKHABYT230D BB/- 
                       4 
       TRX-011 U WO  803 0 1857 MBCCH+CBCH P 2 
       TRX-012 U WO  860 0 1857     0 
       TRX-013 U WO  846 0 1857     1 
       TRX-014 U WO  844 0 1857     2 
       TRX-015 U WO  828 0 1857     0 
       TRX-016 U WO  813 0 1857     1 
10090 30347 BTS-0027 U WO            0 2 
KHAKHABYT340D BB/- 
                       5 
       TRX-017 U WO  801 0 1352 MBCCH+CBCH P 2 
       TRX-018 U WO  857 0 1352     0 
       TRX-019 U WO  840 0 1352     1 
       TRX-020 U WO  838 0 1352     0 
       TRX-021 U WO  836 0 1352     1 
       TRX-022 U WO  823 0 1352     2 
       TRX-023 U WO  821 0 1352     0 
       TRX-024 U WO  817 0 1352     1 

======================================================================================= 

def GetTheSentences(infile): 
    with con: 
     cur = con.cursor() 
     cur.execute("DROP TABLE IF EXISTS eei") 
     cur.execute("CREATE TABLE eei(BCF INT, BTS INT PRIMARY KEY) ") 
    with open(infile) as fp: 
     for result_1 in re.split('BCF-', fp.read(), flags=re.UNICODE): 
      BCF = result_1[:4] 
      for result_2 in re.compile("(?=BTS-)").split(result_1):  
       rec = re.search('TRX-',result_2) 
       if rec is not None: 
        BTS = result_2[4:8] 
        print BCF + "," + BTS 

"BTS-"("10090 31335 BTS-0010") 이전의 13 번째 문자를 포함한 BTS 관련 부분에서 regex lookahead를 사용하여 result_1을 나눠야하고 각 TRX에 대해 result_3으로 나뉘지만 성공하지 못합니다.

지원 해주세요!

답변

6

파이썬의 re.split()은 길이가 0 인 일치 항목에 대해 분할되지 않습니다.

따라서 re.compile("(?=BTS-)").split(result_1)은 결코 문자열을 분할하지 않습니다. re.split()없이 솔루션을 찾거나 새로운 regex module을 사용해야합니다.

+0

BTS = result_2 [4 : 8] BTS-xxxx에서 BTS ID를 가져 오는 중 "BTS-"가 result_2에 "(? = BTS-)"로 남았습니다. 제로 길이가 일치하는 것이 무엇인지 명시 해 주시겠습니까? – user2523580

+0

'(? = BTS-)'는 두 문자 사이의 * 위치 *, 특히 문자열'BTS-'바로 앞의 위치와 일치합니다. 그러나 실제 문자와 일치하지는 않습니다. 그 이유는 항상 일치가 0 문자입니다. 이것은 파이썬 정규 표현 엔진의 단점으로 이것을 유효한 분할 포인트라고 생각하지 않습니다. 다른 정규식 엔진에는 이러한 제한이 없습니다. –

+1

'regex' 모듈을 사용하는 방법을 * 어떻게 설명했는지 ... – Superbest