R中的Regexp匹配某些指定字符的第一个和最后一个出现之间的所有内容

时间:2016-05-24 18:07:43

标签: regex r

我希望匹配第一个和最后一个下划线之间的所有内容。我使用R。 我到现在所拥有的是:

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

在哪里&#39; bla&#39;是除了下划线之外的任何字符......

我喜欢的结果是这样的:

c(NA, NA, bla, bla_bla)

我无法弄明白!为什么第一个模式匹配?它不应该是因为模式必须有2个下划线!或者我是否必须使用某种先行表达式?

非常欢迎你的帮助!

2 个答案:

答案 0 :(得分: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")

答案 1 :(得分: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')