2012-03-08 3 views
0

У меня есть таблицы Excel, которая выглядит следующим образом:Синтаксических для заголовков столбцов в листе Excel с Python

Row1 :   some text 
some other row : "ABC Col" "DEF Col" "GHI Col" "JKL Col" 
following rows : more text 

Я пытаюсь найти строку, содержащую ABC и JKL. Обратите внимание, что строка, которую я передаю, может не совпадать с точным заголовком столбца.

Я использую xlrd и делаю что-то вроде этого:

setOfheadings = set(['ABC', 'JKL']) 
found_header = False 
for i in range(1,sheet.nrows): 
    if ((not found_header)): 
     setOfRowValues = set([element.upper() for element in sheet.row_values(i)]) 
     if len(setOfheadings.intersection(setOfRowValues)) == len(setOfheadings): 
      (found_header, header_row) = (True,i) 

С «ABC» точно не совпадает с «ABC» Col в таблице. Это не удается. Он работает, если мой setOfheadings содержит точное совпадение.

Любые идеи о том, как я могу выполнить регулярное выражение с заданным пересечением?

+1

Этот вопрос не имеет абсолютно ничего общего с 'Excel' или' xlrd'; теги удалены. –

ответ

0

Вот один из способов сделать это. Особенности: Определяет определение неточного соответствия из кода, который выполняет итерации по столбцам и строкам. Позволяет избежать сбоев в нетекстовых данных. Выгружается, когда найденный предположительно желаемый ряд.

targets = ('ABC', 'JKL') 

def fuzzy_match(target, some_text): 
    return target in some_text # or something fancier 

found_header = False  
for i in xrange(1, sheet.nrows): 
    row_text = [ 
     v.upper() 
     for v, t in zip(sheet.row_values(i), sheet.row_types(i)) 
     if t == xlrd.XL_CELL_TEXT # avoid non-text cells; see note below 
     ] 
    found_header = all(
     any(fuzzy_match(target, item) for item in row_text) 
     for target in targets 
     ) 
    if found_header: 
     header_row = i 
     break 

Код, который избегает нетекстовых ячеек, является xlrd-specific; более общий способ сделать это было бы быть:

for v in sheet.row_values(i) 
if isinstance(v, basestring) 
0

Эта проблема связана с NLP, одним из самых сложных предметов в CS. Python имеет мощный модуль, посвященный материалам NLP под названием NLTK (Natural Language Toolkit).

Один из способов сделать это - вычислить расстояние от того, что вы хотите, с помощью какого-либо алгоритма, такого как n-gram, но каждый раз, когда вы делаете подобные нечеткие сравнения, вы рискуете получить ложные срабатывания.