gsub,lookahead和lookbehind

时间:2017-12-13 11:35:18

标签: 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"在新的载体中。

关注this后,我尝试了:

gsub("(?<=of )(.*)(?=_)", "\\1", string.vector)

但是我收到了一个错误:

  

无效的正则表达式&#39;(?&lt; = of)(。*)(?= _)&#39;,原因&#39;无效的正则表达式&#39;

然后我尝试了:

gsub("(?<=of )(.*)(?=_)", "\\1", string.vector, perl = TRUE)

但它返回了完全相同的字符串向量。

我做错了什么?

2 个答案:

答案 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_extractstringr中的regmatches/regexpr

base R

数据

regmatches(string.vector, regexpr("(?<=of )([^_]+)(?=_)", string.vector, perl = TRUE))
#[1] "source1.2" "source1.1" "source1.3"