我想匹配第一个和最后一个下划线之间的所有内容。 我用R 到目前为止,我所拥有的是:

p.subject <- c('bla_bla', 'bla', 'bla_bla_bla', 'bla_bla_bla_bla')
sub('[^_]*_(.*)_[^_]*', x = p.subject, replacement = '\\1', perl = T)

其中“ bla”是除下划线以外的任何字符...

我想要的结果将是这样的:

c(NA, NA, bla, bla_bla)

我想不通! 为什么第一个模式匹配? 这不应该是因为模式必须有2个下划线! 还是我必须使用某种超前表达?

非常欢迎您的帮助!

===============>>#1 票数:2 已采纳

您可以使用gsub

vec <- gsub("(^[^_]+)_?|_?([^_]+$)", "", p.subject)
vec <- ifelse(nchar(vec) == 0 , NA, vec)
vec
[1] NA        NA        "bla"     "bla_bla"

资料

dput(p.subject)
c("bla_bla", "bla", "bla_bla_bla", "bla_bla_bla_bla")

===============>>#2 票数:0

这是使用str_extract另一个选项。 我们使用正则表达式环顾四周来提取指定字符( _的第一次出现和最后一次出现之间的模式。

library(stringr)
str_extract(p.subject, "(?<=[^_]{1,30}_).*(?=_[^_]+)")
#[1] NA        NA        "bla"     "bla_bla"

注意:我们没有使用ifelse

数据

p.subject <- c('bla_bla', 'bla', 'bla_bla_bla', 'bla_bla_bla_bla')

  ask by chrimuelle translate from so

未解决问题?本站智能推荐: