如何动态提取子字符串

3
从字符串中。
s <- "|tree| Lorem ipsum dolor sit amet, |house| consectetur adipiscing elit, 
|street| sed do eiusmod tempor incididunt ut labore et |car| dolore magna aliqua."

我想提取 |-符号内字母后的文本。
我的方法是:
words <- list("tree","house","street","car")

for(word in words){
   expression <- paste0("^.*\\|",word,"\\|\\s*(.+?)\\s*\\|.*$")
   print(sub(expression, "\\1", s))
}

这对于除了最后一个单词“car”之外的所有单词都有效。它会返回整个字符串s。我该如何修改正则表达式,以便在words-list的最后一个元素中打印出“dolore magna aliqua.”?
\编辑:以前的表达式列表是a、b、c、d。针对这个特定问题的解决方案不能很好地推广。

1
如果你对正则表达式不是很熟悉,为了正确使用它,我建议你查看http://regex.inginf.units.it/。 - mhovd
2
我总是觉得在这些情况下使用sub很困惑,因为你必须指定你不想保留的内容,而不是(更自然的)你想要保留的内容。我建议使用stringi::stri_extract_all,例如:stringi::stri_extract_all(regex = "(?<=\\|[abcd]\\| )([^\\|]+)", s)。这使用了回顾后发来匹配|a||b||c||d|而不捕获它。 - Bas
谢谢,假设我要查找的表达式不是 a,b,c,d 而是 tree,house,street,car。我该怎么做? - volfi
3个回答

2

试试这个:

library(stringi)

s <- '|a| Lorem ipsum dolor sit amet, |b| consectetur adipiscing elit, 
|c| sed do eiusmod tempor incididunt ut labore et |d| dolore magna aliqua.'

stri_split_regex(s, '\\|[:alpha:]\\|')

[[1]]
[1] ""                                                " Lorem ipsum dolor sit amet, "                  
[3] " consectetur adipiscing elit, \n"                " sed do eiusmod tempor incididunt ut labore et "
[5] " dolore magna aliqua."     

1
或者 stringr::str_split( s, pattern = "\\|[a-z]\\| ") - Wimpel

2
您可以尝试这个模式。
library(stringr)
s <- "|tree| Lorem ipsum dolor sit amet, |house| consectetur adipiscing elit, 
|street| sed do eiusmod tempor incididunt ut labore et |car| dolore magna aliqua."

str_extract_all(s, regex("(?<=\\|)\\w+(?=\\|)"))
#[1] "tree"   "house"  "street" "car" 
  • (?<=\\|):后顾,即|之后的位置;\\|:表示|的转义符号。
  • \\w:单词字符。
  • (?=\\|):前瞻,即|之前的位置。

1

我建议使用 stringr::str_match_all 提取所有具有相应值的单词:

s <- "|tree| Lorem ipsum dolor sit amet, |house| consectetur adipiscing elit, 
|street| sed do eiusmod tempor incididunt ut labore et |car| dolore magna aliqua."
words1 <- list("tree","house","street","car")
library(stringr)
expression <- paste0("\\|(", paste(words1, collapse="|"),")\\|\\s*([^|]*)")
result <- str_match_all(s, expression)
lapply(result, function(x) x[,-1])

请查看 R演示

输出:

[[1]]
     [,1]     [,2]                                            
[1,] "tree"   "Lorem ipsum dolor sit amet, "                  
[2,] "house"  "consectetur adipiscing elit, \n"               
[3,] "street" "sed do eiusmod tempor incididunt ut labore et "
[4,] "car"    "dolore magna aliqua."    

正则表达式为

\|(tree|house|street|car)\|\s*([^|]*)

查看正则表达式演示,详情如下:

  • \| - 一个|字符
  • (tree|house|street|car) - 第一组:其中之一的单词
  • \| - 一个|字符
  • \s* - 0或多个空格字符
  • ([^|]*) - 第二组:任意0或多个不是|的字符。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接