使用substr直到满足条件

问题描述 投票:1回答:4

我有一个向量,我只需要第一个单词。这些词有不同的长度。单词由符号(。和_)分隔。如何使用substr()函数获取仅包含第一个单词的新向量?

我在想这样的事情

x <- c("wooombel.ab","mugran.cd","friendly_ef.ab","hungry_kd.xy")
y <- substr(x,0, ???)
r condition symbols substr
4个回答
4
投票

我认为sub带有一些正则表达式将是最简单的解决方案:

sub(pattern = "[._].*", replacement = "", x = x)
# [1] "wooombel" "mugran"   "friendly" "hungry"

2
投票

尝试:

sapply(strsplit(x,'[._]'), function(x) x[1])
[1] "wooombel" "mugran"   "friendly" "hungry"  

2
投票

你也可以使用包stringr。它有一些非常方便的字符串操作功能。

想到这个问题的是word。它有一个sep参数,允许使用正则表达式。

> x <- c("wooombel.ab","mugran.cd","friendly_ef.ab","hungry_kd.xy")
> library(stringr)
> word(x, sep = "[._]")
# [1] "wooombel" "mugran"   "friendly" "hungry"  

另一个允许你继续使用substr的选项是str_locate。因此,如果我们只从结果中减去1,我们就可以获得所需的第一个单词。

> substr(x, 1, str_locate(x, "[._]")-1)
# [1] "wooombel" "mugran"   "friendly" "hungry"   

1
投票

使用stringi的提取方法:

library(stringi)
stri_extract_first_regex(x, "[a-z]+(?=[._])")

## [1] "wooombel" "mugran"   "friendly" "hungry"  

虽然"[^a-z]+(?=[._])"可能更明确。

Regex explanation:

[^a-z]+                  any character except: 'a' to 'z' (1 or
                         more times)
(?=                      look ahead to see if there is:
  [._]                     any character of: '.', '_'
)                        end of look-ahead
© www.soinside.com 2019 - 2024. All rights reserved.