Python循环用正则处理Excel报错:re.Pattern不可迭代
解决TypeError: argument of type 're.Pattern' is not iterable错误
这个错误的核心原因是你把编译后的正则re.Pattern对象当成了可迭代对象(比如用在for循环、in判断里),但Pattern本身不能直接迭代,必须调用它的匹配方法来处理文本。
常见错误代码示例
你可能写了类似这样的错误代码:
import openpyxl import re pattern = re.compile(r'Microsoft\..+') wb = openpyxl.load_workbook('file.xlsx') ws = wb.active for row in ws.iter_rows(): cell = row[1] # 错误:直接把pattern用在in判断里 if pattern in cell.value: row[0].value = cell.value
修正方案:调用正则匹配方法
使用pattern.match()(从字符串开头匹配)或pattern.search()(在字符串任意位置匹配)来检查内容是否符合规则,或者用pattern.findall()提取所有匹配项。
方案1:匹配单个内容并复制到左侧列
适合每个单元格只包含一个目标内容的场景:
import openpyxl import re # 编译正则表达式,匹配以Microsoft.开头的内容 pattern = re.compile(r'Microsoft\..+') # 加载工作簿和工作表 wb = openpyxl.load_workbook('your_excel_file.xlsx') ws = wb.active # 或者指定具体工作表:ws = wb['Sheet1'] # 遍历所有行(假设从第2行开始,第1行是表头) for row in ws.iter_rows(min_row=2): # 假设检查第2列(B列)的内容,复制到第1列(A列) source_cell = row[1] target_cell = row[0] if source_cell.value is not None: # 检查单元格内容是否匹配正则 if pattern.match(source_cell.value): target_cell.value = source_cell.value # 保存处理后的工作簿 wb.save('processed_excel_file.xlsx')
方案2:提取单元格内所有匹配项并写入左侧列
如果一个单元格里有多个Microsoft.*格式的内容,可以用findall提取所有匹配结果,逐行写入左侧列:
import openpyxl import re pattern = re.compile(r'Microsoft\.[a-zA-Z0-9]+') wb = openpyxl.load_workbook('your_excel_file.xlsx') ws = wb.active # 初始化左侧列的写入起始行 target_row = 2 for row in ws.iter_rows(min_row=2, max_col=2): source_cell = row[1] if source_cell.value is not None: # 提取所有匹配的内容 matches = pattern.findall(source_cell.value) for match in matches: # 写入左侧第1列(A列) ws.cell(row=target_row, column=1).value = match target_row += 1 wb.save('processed_excel_file_multiple.xlsx')
关键修正点
- 不要直接使用
pattern对象进行迭代或in判断,必须通过match()、search()或findall()方法来处理文本内容。 - 如果需要更宽松的匹配(比如不区分大小写),可以在编译正则时加上
re.IGNORECASE参数:pattern = re.compile(r'microsoft\..+', re.IGNORECASE)
内容的提问来源于stack exchange,提问作者Dave
相关产品推荐
相关产品推荐

