R gsub,向前看和向后看
我有一个字符串向量,包含:R gsub,向前看和向后看,r,regex,R,Regex,我有一个字符串向量,包含: Number of source1.2_SPNB.txt Number of source1.1_SPNB.txt Number of source1.3_SPNB.txt 我需要在一个新的向量中提取“source1.1”、“source1.2”和“source1.3” 接下来,我试着: gsub("(?<=of )(.*)(?=_)", "\\1", string.vector) gsub((?我们可以匹配字符,直到空格(*\\s)或()后面有一个,后面跟
Number of source1.2_SPNB.txt
Number of source1.1_SPNB.txt
Number of source1.3_SPNB.txt
我需要在一个新的向量中提取“source1.1”、“source1.2”和“source1.3”
接下来,我试着:
gsub("(?<=of )(.*)(?=_)", "\\1", string.vector)
gsub((?我们可以匹配字符,直到空格(*\\s
)或(
)后面有一个
,后面跟着其他字符(*
),并将其替换为空白(
)
或者如果我们需要捕获组,那么
sub(".*\\sof\\s([^_]+).*", "\\1", string.vector)
#[1] "source1.2" "source1.1" "source1.3"
出于提取目的,最好使用stru extract
fromstringr
或regmatches/regexpr
frombase R
regmatches(string.vector, regexpr("(?<=of )([^_]+)(?=_)", string.vector, perl = TRUE))
#[1] "source1.2" "source1.1" "source1.3"
regmatches(string.vector,regexpr((?有几个问题:
- 需要perl=TRUE才能使用lookahead/lookahead
- 即使我们使用正则表达式所做的只是用它自己替换所需的子字符串——我们要做的是匹配整个字符串(而不是使用零宽度的lookahead/lookahead),然后用与捕获组匹配的部分替换整个字符串
- 大概只需要一个替换,因此应使用
sub
,而不是gsub
解决这些问题,我们得到:
sub(".*(source.*?)_.*", "\\1", string.vector)
regmatches(string.vector, regexpr("(?<=of )([^_]+)(?=_)", string.vector, perl = TRUE))
#[1] "source1.2" "source1.1" "source1.3"
string.vector <- c("Number of source1.2_SPNB.txt", "Number of source1.1_SPNB.txt",
"Number of source1.3_SPNB.txt")
sub(".*(source.*?)_.*", "\\1", string.vector)