将正则表达式与文字字符串相结合

时间:2015-08-03 13:33:42

标签: regex r

我有以下代码:

input <- "1-FA-1-I2-1-I2-1-I2-1-EX-1-I2-1-I3-1-FA-1-I1-1-I2-1-TR-1-I1-1-I2-1-FA-1-I3-1-I1-1-FA-1-FA-1-NR-1-I3-1-I2-1-TR-1-I1-1-I2-1-I1-1-I2-1-FA-1-I2-1-I1-1-I3-1-FA-1-QU-1-I1-1-I2-1-I2-1-I2-1-NR-1-I2-1-I2-1-NR-1-I1-1-I2-1-I1-1-NR-1-I3-1-QU-1-I2-1-I3-1-QU-1-NR-1-I2-1-I1-1-NR-1-QU-1-QU-1-I2-1-I1-1-EX"

innovation_patterns <- gsub(input, pattern = "-1-", replacement = "-")
innovation_patterns <- lapply(innovation_patterns, str_extract_all, '(?:I\\d-?)*I3(?:-?I\\d)*')

输出:

"I2-I3"    "I3-I1"    "I3-I2"    "I2-I1-I3" "I3"       "I2-I3" 

但是,我只想提取紧跟在特定字符串后面的正则表达式的匹配项,例如:

仅匹配正则表达式,前面是文字字符串 FA-I2-I2-I2-EX

例如,这将是正则表达式的第一个匹配,而第二个匹配则以FA-I1-I2-TR-I1-I2-FA开头。

预期输出与上面的正则表达式大致相同,但只选择5个匹配中的一个,因为它需要以特定的文字字符串开头。

如何修改此正则表达式以达到此目的?我假设它需要使用正向lookbehind来首先识别文字字符串,然后执行正则表达式。

5 个答案:

答案 0 :(得分:2)

我不知道我是否完全理解你的意思,但似乎你可以使用positive lookbehind

例如:

  

(?<=a)b(正向后视)与b中的b(仅cab}匹配,但与bed或{{1}不匹配}

答案 1 :(得分:2)

使用(*SKIP)(*F)

innovation_patterns <- gsub(input, pattern = "-1-", replacement = "-")
innovation_patterns <- lapply(innovation_patterns, str_extract_all, perl('FA-I1-I2-TR-I1-I2-FA.*(*SKIP)(*F)|(?:I\\d-?)*I3(?:-?I\\d)*'))

语法就像,

 partIDontWant.*(*SKIP)(*F)|choose from the string which exists before partIDontWant

DEMO

答案 2 :(得分:2)

应该有一些更直观的东西,但我认为这将完成这项工作

literal <- "FA-I2-I2-I2-EX"
innovation_patterns <- gsub(input, pattern = "-1-", replacement = "-")
a <- lapply(strsplit(innovation_patterns, literal )[[1]], str_extract_all, '(?:I\\d-?)*I3(?:-?I\\d)*')
b <- lapply(2:length(a), function(x){
           a[[x]][[1]][1]
     })

print(b)

答案 3 :(得分:2)

这是你可以采取的另一种方式。

x <- "1-FA-1-I2-1-I2-1-I2-1-EX-1-I2-1-I3-1-FA-1-I1-1-I2-1-TR-1-I1-1-I2-1-FA-1-I3-1-I1-1-FA-1-FA-1-NR-1-I3-1-I2-1-TR-1-I1-1-I2-1-I1-1-I2-1-FA-1-I2-1-I1-1-I3-1-FA-1-QU-1-I1-1-I2-1-I2-1-I2-1-NR-1-I2-1-I2-1-NR-1-I1-1-I2-1-I1-1-NR-1-I3-1-QU-1-I2-1-I3-1-QU-1-NR-1-I2-1-I1-1-NR-1-QU-1-QU-1-I2-1-I1-1-EX"

<强> CODE

substr <- 'FA-I2-I2-I2-EX'
regex <- paste0(substr, '-?((?:I\\d-?)*I3(?:-?I\\d)*)')
gsubfn::strapply(gsub('-1-', '-', x), regex, simplify = c)
## [1] "I2-I3"

答案 4 :(得分:1)

以下是如何实现它:

\d