Power BI R脚本RegEx仅返回第一个匹配项



我在Power BI中有包含mac地址的脏数据,今天我已经学会了R,所以我可以使用正则表达式来提取它们。我可以让一切正常工作,但它只返回第一个mac地址。如果数据包含多个(它们都包含(,则不会返回。

我想将所有mac地址作为列表返回到一个新列中,这样在Power查询中我就可以将它们提取到新行中。

这是我在Power Query Editor中的Power Query代码表单。

# '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) {paste(unlist(regmatches(x, gregexpr(pattern, x))))}
# Return
output <- within(dataset,{MACs1=getMacs(dataset$NICs)})

以下是NIC列的一行中的示例值。

: -kdnic-[00000000] Microsoft Kernel Debug Network Adapter
11:22:33:44:55:66 : 10.0.0.0; Realtek Gaming 2.5GbE Family Controller
22:33:44:55:66:77 : -Netwtw08-[00000002] Intel(R) Wi-Fi 6 AX200 160MHz
33:44:55:66:77:88 : -vwifimp-[00000003] Microsoft Wi-Fi Direct Virtual Adapter
44:55:66:77:88:99 : -vwifimp-[00000004] Microsoft Wi-Fi Direct Virtual Adapter
: -BthPan-[00000005] Bluetooth Device (Personal Area Network)
: -RasSstp-[00000006] WAN Miniport (SSTP)
: -RasAgileVpn-[00000007] WAN Miniport (IKEv2)
: -Rasl2tp-[00000008] WAN Miniport (L2TP)
: -PptpMiniport-[00000009] WAN Miniport (PPTP)
: -RasPppoe-[00000010] WAN Miniport (PPPOE)
55:66:77:88:99:00 : -NdisWan-[00000011] WAN Miniport (IP)
66:77:88:99:00:11 : -NdisWan-[00000012] WAN Miniport (IPv6)
77:88:99:00:11:22 : -NdisWan-[00000013] WAN Miniport (Network Monitor)
88:99:00:11:22:22 : -VPPP-[00000014] Virtual PPP Adapter"

我在新的Macs1列中返回的是每行NIC列中的第一个mac地址。我一辈子都想不出如何将所有mac地址作为列表返回。

我已经使用Visual Studio代码验证了regex的工作原理,并且R代码确实将所有mac地址作为字符向量返回。

R脚本可变内容

在做一些研究时,我认为在将字符向量返回到Power BI之前,我需要将其转换为列表。我尝试修改以下行,但没有成功。

output <- within(dataset,{MACs1=as.list(getMacs(dataset$NICs))})
output <- within(dataset,{MACs1=as.data.frame(getMacs(dataset$NICs))})

我知道这将是一场#newbieFail,但我似乎就是想不通。感谢任何指点或建议。

干杯

regmatches返回一个您想要的列表,但您随后在函数中unlist()它。稍后,当您使用as.list()时,哪个字符串放入哪个列表项的信息已经丢失,因此您得到了一个大小错误的列表。

修复方法是去掉paste(unlist())并使用regmatches:返回的列表

getMacs <- function(x) {regmatches(x, gregexpr(pattern, x))}
data = data.frame(string = c(x, x))
data$macs = getMacs(data$string)
data$macs
# [[1]]
# [1] "11:22:33:44:55:66" "22:33:44:55:66:77" "33:44:55:66:77:88" "44:55:66:77:88:99" "55:66:77:88:99:00"
# [6] "66:77:88:99:00:11" "77:88:99:00:11:22" "88:99:00:11:22:22"
# 
# [[2]]
# [1] "11:22:33:44:55:66" "22:33:44:55:66:77" "33:44:55:66:77:88" "44:55:66:77:88:99" "55:66:77:88:99:00"
# [6] "66:77:88:99:00:11" "77:88:99:00:11:22" "88:99:00:11:22:22"

(调用字符串x(:

x = ": -kdnic-[00000000] Microsoft Kernel Debug Network Adapter
11:22:33:44:55:66 : 10.0.0.0; Realtek Gaming 2.5GbE Family Controller
22:33:44:55:66:77 : -Netwtw08-[00000002] Intel(R) Wi-Fi 6 AX200 160MHz
33:44:55:66:77:88 : -vwifimp-[00000003] Microsoft Wi-Fi Direct Virtual Adapter
44:55:66:77:88:99 : -vwifimp-[00000004] Microsoft Wi-Fi Direct Virtual Adapter
: -BthPan-[00000005] Bluetooth Device (Personal Area Network)
: -RasSstp-[00000006] WAN Miniport (SSTP)
: -RasAgileVpn-[00000007] WAN Miniport (IKEv2)
: -Rasl2tp-[00000008] WAN Miniport (L2TP)
: -PptpMiniport-[00000009] WAN Miniport (PPTP)
: -RasPppoe-[00000010] WAN Miniport (PPPOE)
55:66:77:88:99:00 : -NdisWan-[00000011] WAN Miniport (IP)
66:77:88:99:00:11 : -NdisWan-[00000012] WAN Miniport (IPv6)
77:88:99:00:11:22 : -NdisWan-[00000013] WAN Miniport (Network Monitor)
88:99:00:11:22:22 : -VPPP-[00000014] Virtual PPP Adapter"

相关内容

最新更新