提取与使用相结合的多模式从一些多子,但包含在列表中不是所有的字符串和返回R中列出(Extract &

2019-10-23 06:23发布

我想找到一个优雅和轻松地操纵方式:

  1. 从一些提取多个子,但不是全部,是包含在一个列表的元素(每个列表元素只包含一个长字符串的)串
  2. 替换相应的原长字符串这些多子
  3. 塌陷在每个列表元素子成1串
  4. 返回包含替换子串和未触摸长串酌情相同长度的列表。

这个问题是一个后续的(尽管不同)从我刚才的问题: 替换字符串列表的一些元素的字符串 。 请注意,我不希望在所有列表元素运行正则表达式模式,只有那些到正则表达式应用元素。

我知道最终的结果可以通过交付str_replacesub通过匹配整个字符串被改变,返回由捕获组捕获的文本,如下所示:

library(stringr)
myList <- as.list(c("OneTwoThreeFourFive", "mnopqrstuvwxyz", "ghijklmnopqrs", "TwentyTwoFortyFourSixty"))
fileNames <- c("AB1997R.txt", "BG2000S.txt", "MN1999R.txt", "DC1997S.txt")
names(myList) <- fileNames
is1997 <- str_detect(names(myList), "1997")

regexp <- ".*(Two).*(Four).*"
myListNew2 <- myList
myListNew2[is1997] <- lapply(myList[is1997], function(i) str_replace(i, regexp, "\\1££\\2"))

## This does return what I want:
myListNew2
$AB1997R.txt
[1] "Two££Four"

$BG2000S.txt
[1] "mnopqrstuvwxyz"

$MN1999R.txt
[1] "ghijklmnopqrs"

$DC1997S.txt
[1] "Two££Four"

但我宁愿做而不必匹配整个原文(因为,例如,用于匹配非常长文本所需的时间;多个正则表达式模式和编织在一起的复杂困难,使他们成功地匹配整个字符串)。 我想用正则表达式分离的模式来提取子,然后替换原来的字符串这些提取物。 我想出了以下内容,其中工程。 但肯定有一个更简单,更好的办法! llply

patternA <- "Two"
patternB <- "Four"
x <- myList[is1997]
x2 <- unlist(x)
stringA <- str_extract (x2, patternA)
stringB <- str_extract (x2, patternB)
x3 <- mapply(FUN=c, stringA, stringB, SIMPLIFY=FALSE)
x4 <- lapply(x3, function(i) paste(i, collapse = "££"))
x5 <- relist(x4,x2)
myListNew1 <- replace(myList, is1997, x5)
myListNew1

$AB1997R.txt
[1] "Two££Four"

$BG2000S.txt
[1] "mnopqrstuvwxyz"

$MN1999R.txt
[1] "ghijklmnopqrs"

$DC1997S.txt
[1] "Two££Four"

Answer 1:

这样也许,在那里我已经扩展你正在寻找的模式东西给它如何能成为适应性强:

library(stringr)
patterns <- c("Two","Four","Three")
hits <- lapply(myList[is1997], function(x) {
  out <- sapply(patterns, str_extract, string=x)
  paste(out[!is.na(out)],collapse="££")
})
myList[is1997] <- hits

#[[1]]
#[1] "Two££Four££Three"
#
#[[2]]
#[1] "mnopqrstuvwxyz"
#
#[[3]]
#[1] "ghijklmnopqrs"
#
#[[4]]
#[1] "Two££Four"


文章来源: Extract & combine multiple substrings using multiple patterns from some but not all strings contained in list & return to list in R