繁体   English   中英

gsub,先行后顾

[英]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_extractstringrbase Rregmatches/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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM