发布迭代正则表达式匹配元组到 Excel 文件中的行

Issue Iterating Regex Match Tuples Into Rows Within Excel File

在对 Stack Overflow 和网络进行了类似的研究之后,我找不到解决我的问题的复杂性的方法,因此我在这里提问。我的目标是使用 openpyxl 将每个正则表达式匹配的 5 部分元组的结果逐个迭代到 Excel 行(每组匹配一行;列保持不变)。摘录代码如下:

match = re.findall(pattern, inputfile.read())
if match:
    for tuple in match:
        sheet.cell(row=2, column=1).value = tuple[0]
        sheet.cell(row=2, column=2).value = tuple[1]
        sheet.cell(row=2, column=3).value = tuple[2]
        sheet.cell(row=2, column=4).value = tuple[3]
        sheet.cell(row=2, column=5).value = tuple[4]

但是,我遇到的问题是我无法找到进入下一行以进行下一场比赛的方法。我的代码所做的只是编写,然后用每个新匹配重写第 2 行(它从第 2 行开始,因为第 1 行是 header)。我尝试使用算术运算符(如 + 1)来推进新匹配的行,但这所做的只是将 writing/overwriting 过程向下移动一个。

我如何修复这段代码,以便每个新匹配项(及其由 5 部分组成的元组)插入到新行中并且不会覆盖之前插入的匹配项?谢谢!

P.S。我是 Stack Overflow 的新手,所以如果我提出的问题与规范不符,请告诉我(+ 我可以解决问题的方法)。

您需要将计数变量定义为全局变量。

row = 2
match = re.findall(pattern, inputfile.read())
if match:
    for tuple in match:
        sheet.cell(row=row, column=1).value = tuple[0]
        sheet.cell(row=row, column=2).value = tuple[1]
        sheet.cell(row=row, column=3).value = tuple[2]
        sheet.cell(row=row, column=4).value = tuple[3]
        sheet.cell(row=row, column=5).value = tuple[4]
        row += 1

# now row equals to 2 + len(match)
match_2 = re.findall(pattern_2, inputfile.read())
if match_2:
    for tuple in match_2:
        sheet.cell(row=row, column=1).value = tuple[0]
        sheet.cell(row=row, column=2).value = tuple[1]
        sheet.cell(row=row, column=3).value = tuple[2]
        sheet.cell(row=row, column=4).value = tuple[3]
        sheet.cell(row=row, column=5).value = tuple[4]
        row += 1

这会起作用,但是有很多重复的代码。

import itertools


def insert(patterns, inputfile, sheet, row=2):
    """insert matches into worksheet 

    :param patterns: pattern list e.g. [r'\d+', r'[a-z]*']
    :param inputfile: file to match
    :param sheet: worksheet
    :param row: start row
    :return:
    """
    match = itertools.chain(filter(lambda x: x, map(lambda x: re.findall(re.compile(x), inputfile.read()), patterns)))
    for r in match:
        for column in range(5):
            sheet(row=row, column=column+1).value = r[column]
            row += 1 

openpyxl 默认在当前 max_row 下面添加行。注意这可能不是包含值的单元格的最后一行。

以下应该适合您:

match = re.findall(pattern, inputfile.read())
if match:
    for tuple in match:
        ws.append(tuple)