发布迭代正则表达式匹配元组到 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)
在对 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)