提问人:Dave 提问时间:11/11/2023 最后编辑:Mayukh BhattacharyaDave 更新时间:11/11/2023 访问量:54
在 python 循环中使用正则表达式或通配符
Using regex or wildcards in a python loop
问:
我正在整理一个 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
我确定我想做什么,它非常简单,但它让我难住了。
提前致谢。
答:
0赞
user19151114
11/11/2023
#1
该问题的唯一原因是您没有按预期使用正则表达式的库。我个人建议你看一眼它的文档,特别是如果你打算经常使用它。
对循环中第一个 if 语句的以下修改将首先确保该值有效,在这种情况下不是,以防御性编程方式,因为我假设这就是 openpyxl 处理缺失条目的方式;然后,它利用应用于 RE 的 match 方法。模式实例,在本例中是你的变量,它接受一个字符串作为参数,它根据模式进行测试。或者,您可以使用包范围的函数 re.match(),而不是使用实例端方法,该函数接受模式和要与之匹配的字符串。None
pattern
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
除此之外,我假设您需要检查列上的单元格是否匹配,然后更新相应的单元格。如果是这样,正则表达式似乎没有必要,您可以简单地检查值是否以
.TypeError
B
Microsoft*
A
Microsoft
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")
输出:
评论
1赞
Dave
11/11/2023
完美 - 干杯伙计!
评论