You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Power BI中R脚本正则仅返回首个MAC地址 如何提取全部结果?

问题原因

你当前脚本的核心问题有两个:

  1. gregexpr 本身会返回每个输入字符串的所有匹配结果列表,但你原来的getMacs函数用unlist把所有行的匹配结果拍平成了一个一维向量,R在给数据框列赋值时会自动循环补全,导致每行只拿到第一个匹配值
  2. 要让Power Query识别单单元格多值,你可以选择两种存储方式:R列表列 或者 自定义分隔符拼接的字符串,后者对Power Query后续处理更友好,兼容性更高。

方案1:自定义分隔符拼接MAC地址(推荐,兼容性最好)

直接修改你的R脚本如下:

# 'dataset' holds the input data for this script

# Variables
pattern <- "([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})|([0-9a-fA-F]{4}\\.[0-9a-fA-F]{4}\\.[0-9a-fA-F]{4})"

# Functions
getMacs <- function(x) {
  # 逐行匹配所有MAC
  match_res <- regmatches(x, gregexpr(pattern, x))
  # 每行的多个MAC用|拼接,无匹配则返回空值
  sapply(match_res, function(m) {
    if(length(m) == 0) return("")
    paste(m, collapse = "|")
  })
}

# 生成新列
dataset$MACs1 <- getMacs(dataset$NICs)
output <- dataset

后续Power Query处理:选中MACs1列,点击「拆分列」-「按分隔符」,选择|作为分隔符,拆分选项选「拆分为行」即可。


方案2:直接存储为列表列

如果你希望直接在R侧生成列表列,脚本修改如下:

# 'dataset' holds the input data for this script

# Variables
pattern <- "([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})|([0-9a-fA-F]{4}\\.[0-9a-fA-F]{4}\\.[0-9a-fA-F]{4})"

# Functions
getMacs <- function(x) {
  match_res <- regmatches(x, gregexpr(pattern, x))
  # 空匹配替换为NA避免长度错误
  lapply(match_res, function(m) if(length(m) == 0) NA_character_ else m)
}

# 生成列表列
dataset$MACs1 <- getMacs(dataset$NICs)
output <- dataset

后续Power Query处理:导入R脚本返回的结果后,直接选中MACs1列,点击「扩展到新行」即可。


内容的提问来源于stack exchange,提问作者Chiper

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 11:06:03