2013-10-01 69 views
0

我有一些需要解析的.csv文件,並且卡在需要在不同行中分隔的部分中。要清楚:在REGEX搜索中循環

  • 一個部分是,如果一個鍵值爲Y應該檢查該文件具有類別的數量[現在工作]

這是樣本CSV:

004 000000,Y 
005 000000,N 
006 000000,N 
007 A000000,Y 
007 B000000,16 
007 C010100,1 
007 C020100,XTF ADVISORS TRUST - ETF 2010 PORTFOLIO 
007 C030100,Y 
007 C010200,2 
007 C020200,XTF ADVISORS TRUST - ETF 2015 PORTFOLIO 
007 C030200,Y 
007 C010300,3 
007 C020300,XTF ADVISORS TRUST - ETF 2020 PORTFOLIO 
007 C030300,Y 
007 C010400,4 
007 C020400,XTF ADVISORS TRUST - ETF 2025 PORTFOLIO 
007 C030400,Y 
007 C010500,5 
007 C020500,XTF ADVISORS TRUST - ETF 2030 PORTFOLIO 
007 C030500,Y 
007 C010600,6 

Python代碼的這一部分,返回部分的數量和相關007 A000000線路:

def haveSeries(csvfile): 
with open(csvfile, 'rb') as f: 
    reader = csv.reader(f) 
    row2 = 0 
    for row in reader: 
     if (row[0] == '007 A000000') and (row[1]=='Y'): 
      baseline = reader.line_num 
      print baseline 
      seriesnum = reader.next() 
      print seriesnum[1] 
      return (baseline,seriesnum[1]) 

上面的例子返回16,所以我們有16個類別。所以現在我應該製作另一個csv,其中包含所有行中的所有[Key, Values][007 A000000,Y]以及每行的下一列中與類別編號相關的數據。 類別的序號鍵,如

086 D020000,0 
086 E010000,0 
086 E020000,0 
086 F010000,0 
086 F020000,0 
024 000100,N 
025 D000101,0 
025 D000102,0 
025 D000103,0 
025 D000104,0 
025 D000105,0 
025 D000106,0 
025 D000107,0 
***... Category 1 starts at 024 000100 ...*** 
075 A000100,0 
075 B000100,0 
076 000100,0.00 
024 000200,N 
025 D000201,0 
025 D000202,0 
025 D000203,0 
025 D000204,0 
025 D000205,0 
***... category 2 starts at 024 000200... and so on*** 

所以正則表達式來識別這些會是這樣的\d{3}(\w| )\d{3}X\d.{,}對於X我不得不重複1至16爲每個類別不同的​​行。

,我寫這部分代碼:

if haveSeries(csvfile) != False: 
     seriesBaseNNum=haveSeries(csvfile) 
     # TODO write all the lines from 1 to baseline again 
     for row in reader: 
      for i in xrange(1,int(seriesBaseNNum[1])): 
       i= u'%02d' % i # two digits 
       seriesi = re.compile ("\d{3}(\w| )\d{3}%s\d.{,}" % i) #err on %d so changed to %s 
       matchers = seriesi.search(row[0]) 
       if matchers: 
        print matchers.**group(0)** 

,但我得到這樣的輸出:

074 T000100 
074 U010100 
074 U020100 
074 V010100 
074 V020100 
074 W000100 
074 X000100 
074 Y000100 
075 A000100 
075 B000100 
076 000100 
024 001100 
025 D001101 
025 D001102 
025 D001103 
025 D001104 
025 D001105 
025 D001106 
025 D001107 
025 D001108 
028 A011100 
028 A021100 
028 A031100 
028 A041100 
028 B011100 
028 B021100 
028 B031100 
028 B041100 
028 C011100 
028 C021100 
... 

所以只迭代一次,並在I = 1(和機會,我= 11,我的意思是當%s是1並且它之前的字符是1)

  1. 如何在正則表達式上進行迭代以找到所有匹配的i = 1 t在這個例子中是16?
  2. 我應該如何實現必須爲所有類別編寫前n列的部分,並將其餘部分寫入每行的下一列?
+1

嗨,我編輯了你的問題,以便它在csv示例中讀得更好一點。你能否檢查一下你最初的目標是什麼? – Jerry

+0

我想我的下一行字符丟失;)謝謝傑裏 – Shayan

回答

0

的問題是與該正則表達式,爲條件的線本來應該這樣:

seriesi = re.compile ("\d{3}(\w| )\d{2}%02d\d{2}.{,}" %i) 

,然後一個用於環路從一個到類別的數目寫1到seriesBaseNNum [0 ]和另一個將類別寫入CVS中的每一行。

感謝您的幫助。

2

您的matchers變量是Match Object。根據documentation,您可以通過group訪問結果。

>>> import re 
>>> m = re.search('(?<=abc)def', 'abcdef') 
>>> m.group(0) 
'def' 
+0

謝謝,這解決了顯示輸出的問題。但我怎麼做循環?用我得到的代碼我只能得到i = 1的結果(因爲1而i = 11)。 – Shayan