我正在整理 Excel 工作簿,我需要找到 Microsoft.* 的所有实例 - 例如 Microsoft.Compute 和 Microsoft.Cdn - 并将它们复制到左侧的列中。
我已将这段代码放在一起,但它不喜欢正则表达式
import openpyxl as op
import re
wb = op.load_workbook("original-workbook.xlsx")
ws = wb["Sheet1"]
pattern = re.compile(r'Microsoft.+')
for row in ws.iter_rows(min_row=1, max_col=3):
if row[1].value in pattern:
row[0].value = pattern[row[1].value]
wb.save("new-improved-workbook.xlsx")
这是错误:
TypeError: argument of type 're.Pattern' is not iterable
我确定我想做的事情非常简单,但它让我难住了。
提前致谢。
问题产生的唯一事实是您没有按预期使用正则表达式库。我个人建议您看一下它的文档,特别是如果您要经常使用它的话。
对循环中第一个 if 语句的以下修改将首先确保该值有效,在本例中不是
None
,以防御性编程方式,因为我认为这就是 openpyxl 处理丢失条目的方式;然后它利用应用于 re.Pattern 实例的 match 方法,在本例中是您的 pattern
变量,并且该方法将字符串作为参数,并根据模式进行测试。或者,您可以使用包范围函数 re.match(),而不是使用实例端方法,该函数接受模式和要与之匹配的字符串。
import openpyxl as op
import re
wb = op.load_workbook("original-workbook.xlsx")
ws = wb["Sheet1"]
pattern = re.compile(r'Microsoft.+')
for row in ws.iter_rows(min_row=1, max_col=3):
if row[1].value and pattern.match(row[1].value):
row[0].value = pattern.sub('', row[1].value)
wb.save("new-improved-workbook.xlsx")
除了
TypeError
之外,我假设您还需要检查B
列来更新A
。
startswith
与 Microsoft
。
from openpyxl as import load_workbook
wb = load_workbook("original-workbook.xlsx")
ws = wb["Sheet1"]
pattern = re.compile(r"Microsoft.+")
for row in ws.iter_rows(min_row=1, max_col=3):
if row[1].value and row[1].value.startswith("Microsoft"):
# if row[1].value and pattern.match(row[1].value): # to fix your code
row[0].value = row[1].value
wb.save("new-improved-workbook.xlsx")
输出: