首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Power BI R脚本RegEx仅返回第一个匹配项

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

Stack Overflow用户
提问于 2021-11-25 04:44:26
回答 1查看 68关注 0票数 0

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

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

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

代码语言:javascript
复制
# '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列中某行的示例值。

代码语言:javascript
复制
: -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代码验证了正则表达式工作正常,并且R代码确实将所有mac地址作为字符向量返回。

R Script Variable Contents

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

代码语言:javascript
复制
output <- within(dataset,{MACs1=as.list(getMacs(dataset$NICs))})
output <- within(dataset,{MACs1=as.data.frame(getMacs(dataset$NICs))})

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

干杯

EN

回答 1

Stack Overflow用户

发布于 2021-11-25 06:16:06

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

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

代码语言:javascript
复制
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):

代码语言:javascript
复制
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"
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70105916

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档