Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R gsub,向前看和向后看_R_Regex - Fatal编程技术网

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
from
stringr
regmatches/regexpr
from
base 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)