r语言 - 提取特定格式的部分字符串



我目前正试图破解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"

最新更新