我目前正试图破解R中看似简单的问题,但不知怎的,我无法找到一种方法来实现gsub
,str_match()
或其他一些rgex
相关的功能。有人能帮我解决这个问题吗?
假设我有一个长度为100的列向量。向量中的每个元素都具有[string]_[string+number]_[someinfo]
的形式。现在,我只想提取每个元素的第一部分,即[string]_[string+number]
。[string]_[string+number]
(不包括_
)中字符数的可能上限可以在8和20之间的任何位置。,但没有固定的长度。我如何使用某些类型的rgex
表达式在R中做到这一点?
x = c('XY_ABCD101_12_ACE', 'XZ_ACC122_100_BAN', 'XT_AAEEE100_12345_ABC', 'XKY_BBAAUUU124_100')
所期望的输出。
x1 = c('XY_ABCD101', 'XZ_ACC122', 'XT_AAEEE100', 'XKY_BBAAUUU124')
我们可以使用stringr
包中的str_extract
和匹配的regex来删除第二个下划线之后的所有内容:
library(stringr)
str_extract(x, "[^_]*_[^_]*")
[1] "XY_ABCD101" "XZ_ACC122" "XT_AAEEE100" "XKY_BBAAUUU124"
library(stringr)
str_extract(x, "[:alnum:]+_[:alnum:]+(?=_)")
[1] "XY_ABCD101" "XZ_ACC122"
[3] "XT_AAEEE100" "XKY_BBAAUUU124"
str_remove
的选项
library(stringr)
str_remove(x, "_\d+.*")
[1] "XY_ABCD101" "XZ_ACC122" "XT_AAEEE100" "XKY_BBAAUUU124"
你可以使用一个模式来断言9-21个字符,包括下划线,然后用单个下划线匹配前两个部分:
^(?=\w{9,21}_[A-Z0-9])[A-Z]+_[A-Z0-9]+
^
起始字符串(?=
正向前看,断言当前位置的右边是什么\w{9,21}_[A-Z0-9]
匹配9字字符下划线和字符a - z、数字
)
关闭forward[A-Z]+
匹配1+字符A-Z_
匹配首下划线[A-Z0-9]+
匹配1+字符a - z或数字
Regex演示演示| R
x = c('XY_ABCD101_12_ACE', 'XZ_ACC122_100_BAN', 'XT_AAEEE100_12345_ABC', 'XKY_BBAAUUU124_100')
regmatches(x, regexpr("^(?=\w{9,21}_[A-Z0-9])[A-Z]+_[A-Z0-9]+", x, perl = TRUE))
输出[1] "XY_ABCD101" "XZ_ACC122" "XT_AAEEE100" "XKY_BBAAUUU124"
试试这个
regmatches(x , regexpr("\D+_\D+\d+" , x))
输出[1] "XY_ABCD101" "XZ_ACC122" "XT_AAEEE100"
[4] "XKY_BBAAUUU124"
由于您预期的输出字符串总是以_
之前的最后一个数字结束,因此您可以尝试模式(?<=\d)(?=_)
来查找位置并删除
> gsub("(?<=\d)(?=_).*$","",x,perl = TRUE)
[1] "XY_ABCD101" "XZ_ACC122" "XT_AAEEE100" "XKY_BBAAUUU124"