拆分并重新连接字符串

Dig*_*ant 6 string r

我试图从字符串列表中获取IP地址的主机.

ips <- c('140.112.204.42', '132.212.14.139', '31.2.47.93', '7.112.221.238')
Run Code Online (Sandbox Code Playgroud)

我想从ips获得前两位数字.输出:

ips <- c('140.112', '132.212', '31.2', '7.112')
Run Code Online (Sandbox Code Playgroud)

这是我写的转换它们的代码:

cat(unlist(strsplit(ips, "\\.", fixed = FALSE))[1:2], sep = ".")
Run Code Online (Sandbox Code Playgroud)

当我最后检查单个ips的类型时,我会得到这样的结果:

140.112 NULL
Run Code Online (Sandbox Code Playgroud)

不确定我做错了什么.如果你有一些完全不同于此的其他想法,那也完全没问题.

avi*_*seR 4

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"
Run Code Online (Sandbox Code Playgroud)

str_extract来自stringr

library(stringr)
str_extract(ips, '^\\d+\\.\\d+')
# [1] "140.112" "132.212" "31.2"    "7.112"
Run Code Online (Sandbox Code Playgroud)

strsplit+ sapply

sapply(strsplit(ips, '\\.'), function(x) paste(x[1:2], collapse = '.'))
# [1] "140.112" "132.212" "31.2"    "7.112"
Run Code Online (Sandbox Code Playgroud)

read.table+ apply

apply(read.table(textConnection(ips), sep='.')[1:2], 1, paste, collapse = '.')
#[1] "140.112" "132.212" "31.2"    "7.112"
Run Code Online (Sandbox Code Playgroud)

笔记:

  1. sub('\\.\\d+\\.\\d+$', '', ips):

    我。匹配字符串末尾的\\.\\d+\\.\\d+$一个文字点、一个数字一次或多次、再次匹配一个文字点和一个数字一次或多次

    二. 从字符串中sub 删除上面的匹配项

  2. str_extract(ips, '^\\d+\\.\\d+'):

    我。^\\d+\\.\\d+匹配数字一次或多次、字符串开头的文字点和数字一次或多次

    二. 从字符串中str_extract 提取上面的匹配项

  3. sapply(strsplit(ips, '\\.'), function(x) paste(x[1:2], collapse = '.')):

    我。使用文字点作为分隔符来strsplit(ips, '\\.')分割每个。ip这将返回分割后的向量列表

    二. 使用sapply,paste(x[1:2], collapse = '.')应用于列表的每个元素,因此仅从每个向量中取出前两个数字,并用点作为分隔符将它们折叠起来。sapply然后将列表强制转换为向量,从而返回所需 ip 的向量。

  4. apply(read.table(textConnection(ips), sep='.')[1:2], 1, paste, collapse = '.'):

    我。read.table(textConnection(ips), sep='.')[1:2]视为ips文本输入并以点作为分隔符读入。只取前两列。

    二. apply可以paste对每一行进行操作,并以点折叠。