2013-10-01 3 views
0

У меня есть .csv-файлы, которые нужно разобрать, и я застрял в одной части, которую нужно разделить в разных строках. чтобы понять:Loop в поиске 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 
... 

так это только итерацию один раз и я = 1 (и случайно я = 11, я имею в виду, когда% s равно 1 и символ до того, как он равен 1)

  1. Как я могу выполнить итерацию в Regex, чтобы найти все соответствия для i = 1 t o 16 в этом примере?
  2. Как я должен реализовать часть, которая должна написать первый столбец n для всех категорий и записать остальные в следующих столбцах каждой строки?
+1

Привет, я отредактировал ваш вопрос, чтобы он читал немного лучше в образцах csv. Не могли бы вы просто проверить, действительно ли это было изначально? – Jerry

+0

Я предполагаю, что мой следующий символ линии отсутствовал;) спасибо Джерри – Shayan

ответ

0

проблема была с Regex, линия для условия должно было быть так:

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 (и i = 11 из-за 1). – Shayan

Смежные вопросы