Regex 在文本中使用R表示正则表达式IP地址

Regex 在文本中使用R表示正则表达式IP地址,regex,r,gsub,Regex,R,Gsub,我试图解析一个数据帧,该数据帧的每一行都有文本,并且在该文本中有我想要隔离的IP地址。然而,我仍然在学习整数、整数和句点。下面是我正在使用的示例 z <- data.frame( x = c('112.68.196.98 5.32', '192.41.196.888', '..','5.32 88')) gsub("^\\.+|\\.[^.]*$", "", z$x, perl=TRUE) z我认为这应该有效: re <- regexpr( "(?(?=

我试图解析一个数据帧,该数据帧的每一行都有文本,并且在该文本中有我想要隔离的IP地址。然而,我仍然在学习整数、整数和句点。下面是我正在使用的示例

    z <- data.frame( x =  c('112.68.196.98   5.32', '192.41.196.888', '..','5.32  88'))
    gsub("^\\.+|\\.[^.]*$", "", z$x, perl=TRUE)

z我认为这应该有效:

re <- regexpr(
  "(?(?=.*?(\\d+\\.\\d+\\.\\d+\\.\\d+).*?)(\\1|))", 
  z$x, perl = TRUE)

regmatches(z$x, re)
#[1] "112.68.196.98"  "192.41.196.888" ""               ""
由于对
gregexpr
输入调用
regmatches
将返回一个列表,因此需要一些额外的处理:

res2 <- sapply(regmatches(z2$x, re2), function(x) {
  gsub(
    "^\\s+|\\s+$", "", 
    gsub("\\s+", " ", paste0(x, collapse = " "))
  )
}

如果您确实想将每个结果分解为它自己的字符串,那么表达式要简单一些(与
sapply(…)
):


数据:

z2 <- data.frame(
  x = c('112.68.196.98 5.32 192.41.196.888', 
        '192.41.196.888', 
        '..', '5.32 88 112.68.196.98'),
  stringsAsFactors = FALSE
)

z2可能重复的R使用了稍微不同的语法。不是复制品,只是非常相似。谢谢你。这很有效。还有一个问题,如果我在同一个单元格中有多个IP,我将如何修改它以捕获一个或多个IP。例如:z应该将多个IP拆分为它们自己的字符串,还是保持组合(例如,用空格分隔)?出于我的项目目的,我将它们合并为一个单元格/元素(用空格分隔),稍后我会将它们拆分。我希望他们保留相关的索引。谢谢
res2 <- sapply(regmatches(z2$x, re2), function(x) {
  gsub(
    "^\\s+|\\s+$", "", 
    gsub("\\s+", " ", paste0(x, collapse = " "))
  )
}
res2
#[1] "112.68.196.98 192.41.196.888" "192.41.196.888"               
#     ""                             "112.68.196.98" 
lapply(regmatches(z2$x, re2), function(x) {
  Filter(function(y) y != "", x)
})
#[[1]]
#[1] "112.68.196.98"  "192.41.196.888"

#[[2]]
#[1] "192.41.196.888"

#[[3]]
#character(0)

#[[4]]
#[1] "112.68.196.98"
z2 <- data.frame(
  x = c('112.68.196.98 5.32 192.41.196.888', 
        '192.41.196.888', 
        '..', '5.32 88 112.68.196.98'),
  stringsAsFactors = FALSE
)