我有一个包含以下内容的字符串向量:
Number of source1.2_SPNB.txt
Number of source1.1_SPNB.txt
Number of source1.3_SPNB.txt
我需要提取" source1.1"," source1.2"和" source1.3"在新的载体中。
关注this后,我尝试了:
gsub("(?<=of )(.*)(?=_)", "\\1", string.vector)
但是我收到了一个错误:
无效的正则表达式&#39;(?&lt; = of)(。*)(?= _)&#39;,原因&#39;无效的正则表达式&#39;
然后我尝试了:
gsub("(?<=of )(.*)(?=_)", "\\1", string.vector, perl = TRUE)
但它返回了完全相同的字符串向量。
我做错了什么?
答案 0 :(得分:4)
有几个问题:
perl = TRUE需要使用lookahead / lookbehind
即使我们使用正则表达式正在做的只是用自己替换所需的子字符串 - 我们想要做的是匹配整个字符串(而不是使用零宽度前瞻/后观)然后仅使用与捕获组匹配的部分替换整个字符串。
大概只需要一次替换,因此应使用sub
,而不是gsub
解决我们遇到的这些问题:
sub(".*(source.*?)_.*", "\\1", string.vector)
答案 1 :(得分:1)
我们可以匹配字符,直到空格(.*\\s
)或(|
)a _
后跟其他字符(.*
)并将其替换为空格({{ 1}})
""
或者,如果我们需要捕获组,那么
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
中的regmatches/regexpr
base R
regmatches(string.vector, regexpr("(?<=of )([^_]+)(?=_)", string.vector, perl = TRUE))
#[1] "source1.2" "source1.1" "source1.3"