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

Using regex or wildcards in a python loop

提问人:Dave 提问时间:11/11/2023 最后编辑:Mayukh BhattacharyaDave 更新时间:11/11/2023 访问量:54

问:

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

我确定我想做什么,它非常简单,但它让我难住了。

提前致谢。

蟒蛇 excel openpyxl python-re

评论

0赞 jlandercy 11/11/2023
模式是一个对象,保存已编译的正则表达式,因此不可迭代。您需要调用 match 或 search 等方法来访问组并循环访问它们。

答:

0赞 user19151114 11/11/2023 #1

该问题的唯一原因是您没有按预期使用正则表达式的库。我个人建议你看一眼它的文档,特别是如果你打算经常使用它。

对循环中第一个 if 语句的以下修改将首先确保该值有效,在这种情况下不是,以防御性编程方式,因为我假设这就是 openpyxl 处理缺失条目的方式;然后,它利用应用于 RE 的 match 方法。模式实例,在本例中是你的变量,它接受一个字符串作为参数,它根据模式进行测试。或者,您可以使用包范围的函数 re.match(),而不是使用实例端方法,该函数接受模式和要与之匹配的字符串。Nonepattern

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赞 Timeless 11/11/2023
这是人工智能生成的答案吗?你的其他答案暗示了这一点!请阅读此内容
0赞 11/11/2023
现在是什么让你假设,在这个时代,人们难道不能迂腐,并在此基础上渴望一种受欧洲趋势影响的写作方式,而不是美国现代屠杀英语的方式?
1赞 Timeless 11/11/2023 #2

除此之外,我假设您需要检查列上的单元格是否匹配,然后更新相应的单元格。如果是这样,正则表达式似乎没有必要,您可以简单地检查值是否 .TypeErrorBMicrosoft*AMicrosoft

from openpyxl import load_workbook

wb = load_workbook("original-workbook.xlsx")
ws = wb["Sheet1"]

# pattern = re.compile(r"Microsoft.+") # uncomment if regex needed

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

输出:

enter image description here

评论

1赞 Dave 11/11/2023
完美 - 干杯伙计!