[英]In R, gsub & Regex lookahead or lookbehind expression to remove everything BEFORE a string pattern?
[英]gsub, lookahead and lookbehind
我有一个字符串向量,其中包含:
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)
但是我得到一个错误:
无效的正则表达式'(?<= of)(。*)(?= __'',原因'无效的正则表达式'
然后,我尝试:
gsub("(?<=of )(.*)(?=_)", "\\1", string.vector, perl = TRUE)
但是它返回了完全相同的字符串向量。
我究竟做错了什么?
有几个问题:
perl = TRUE需要使用超前/后向
即使我们使用正则表达式所做的只是用其自身替换所需的子字符串-我们想要做的就是匹配整个字符串(而不是使用零宽度的lookahead / lookbehind),然后将整个字符串替换为与捕获组匹配的部分。
大概只需要一个替换,所以应该使用sub
,而不是gsub
。
解决这些问题,我们得到:
sub(".*(source.*?)_.*", "\\1", string.vector)
我们可以匹配字符,直到空格( .*\\\\s
)或( |
) _
后跟其他字符( .*
),然后将其替换为空白( ""
)
gsub(".*\\s|_.*", "", string.vector)
#[1] "source1.2" "source1.1" "source1.3"
或者,如果我们需要捕获组,那么
sub(".*\\sof\\s([^_]+).*", "\\1", string.vector)
#[1] "source1.2" "source1.1" "source1.3"
出于提取目的,最好使用str_extract
的stringr
或base R
的regmatches/regexpr
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")
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.