我正在尝试从字符串列表中获取IP地址的主机。

ips <- c('140.112.204.42', '132.212.14.139', '31.2.47.93', '7.112.221.238')

我想从ips获取前2位数字。输出:
ips <- c('140.112', '132.212', '31.2', '7.112')

这是我编写的用于转换它们的代码:
cat(unlist(strsplit(ips, "\\.", fixed = FALSE))[1:2], sep = ".")

当我最终检查单个ip的类型时,我得到的是这样的:
140.112 NULL

不知道我在做什么错。如果您有其他一些与此完全不同的想法,那也完全可以。

最佳答案

sub:

ips <- c('140.112.204.42', '132.212.14.139', '31.2.47.93', '7.112.221.238')

sub('\\.\\d+\\.\\d+$', '', ips)
# [1] "140.112" "132.212" "31.2"    "7.112"

使用str_extract中的stringr:
library(stringr)
str_extract(ips, '^\\d+\\.\\d+')
# [1] "140.112" "132.212" "31.2"    "7.112"

使用strsplit + sapply:
sapply(strsplit(ips, '\\.'), function(x) paste(x[1:2], collapse = '.'))
# [1] "140.112" "132.212" "31.2"    "7.112"

使用read.table + apply:
apply(read.table(textConnection(ips), sep='.')[1:2], 1, paste, collapse = '.')
#[1] "140.112" "132.212" "31.2"    "7.112"

注意:
  • sub('\\.\\d+\\.\\d+$', '', ips):

    一世。 \\.\\d+\\.\\d+$在字符串的末尾匹配一个文字点,一个或多个数字,一个文字点和一个或多个数字

    ii。 sub 从字符串
  • 中删除上述匹配项
  • str_extract(ips, '^\\d+\\.\\d+'):

    一世。 ^\\d+\\.\\d+在字符串
    的开头匹配一个或多个数字,一个文字点和一个或多个数字

    ii。 str_extract 从字符串
  • 中提取上述匹配项
  • sapply(strsplit(ips, '\\.'), function(x) paste(x[1:2], collapse = '.')):

    一世。 strsplit(ips, '\\.')使用文字点作为定界符分割每个ip。分割后返回向量列表

    ii。使用sapplypaste(x[1:2], collapse = '.')应用于列表的每个元素,因此仅取每个向量中的前两个数字,并将它们折叠成一个点作为分隔符。然后sapply将列表强制为一个向量,从而返回所需ips的向量。
  • apply(read.table(textConnection(ips), sep='.')[1:2], 1, paste, collapse = '.'):

    一世。 read.table(textConnection(ips), sep='.')[1:2]ips视为文本输入,并以点作为定界符读取它。仅取前两列。

    ii。 apply使paste可以在每行上操作,并以点折叠。
  • 关于r - 分割并重新连接字符串,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51447942/

    10-11 16:52