在Python循环中使用正则表达式或通配符

问题描述 投票:0回答:2

我正在整理 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

我确定我想做的事情非常简单,但它让我难住了。

提前致谢。

python excel openpyxl python-re
2个回答
0
投票

问题产生的唯一事实是您没有按预期使用正则表达式库。我个人建议您看一下它的文档,特别是如果您要经常使用它的话。

对循环中第一个 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")

0
投票

除了

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")

输出:

© www.soinside.com 2019 - 2024. All rights reserved.