0

我有一个看起来像这样的 Excel 电子表格:

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”不完全匹配。它失败。如果 mysetOfheadings包含完全匹配,它会起作用。

关于如何使用集合交集进行正则表达式匹配的任何想法?

4

2 回答 2

0

这类问题与 NLP 相关,NLP是 CS 中最难的科目之一。Python 有一个强大的模块专门用于 NLP 东西,称为NLTK(自然语言工具包)。

一种方法是使用诸如n-gram 之类的算法计算从您想要的结果到您得到的结果的距离,但是每次进行这种模糊比较时,您都有得到误报的风险。

于 2012-03-08T22:24:02.377 回答
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 的;一种更通用的方法是:

for v in sheet.row_values(i)
if isinstance(v, basestring)
于 2012-03-09T10:02:43.187 回答