繁体   English   中英

Power BI R 脚本正则表达式仅返回第一个匹配项

[英]Power BI R Script RegEx Only Returns First Match

我在 Power BI 中有包含 mac 地址的脏数据,并且今天学习了 R,以便我可以使用正则表达式将它们全部提取出来。 我可以让一切正常,但它只返回第一个 mac 地址。 如果数据包含多个(他们都这样做),则不会返回。

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

这是我在 Power Query 编辑器中的 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 Code 验证了正则表达式有效,并且 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返回一个你想要的列表,但是你在你的 function 中unlist()它。 后来,当您使用as.list()时,哪个字符串进入哪个列表项的信息已经丢失,因此您得到一个大小错误的列表。

解决方法是摆脱您的paste(unlist()) regmatches使用 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"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM