我想找到一个优雅和轻松地操纵方式:
- 从一些提取多个子,但不是全部,是包含在一个列表的元素(每个列表元素只包含一个长字符串的)串
- 替换相应的原长字符串这些多子
- 塌陷在每个列表元素子成1串
- 返回包含替换子串和未触摸长串酌情相同长度的列表。
这个问题是一个后续的(尽管不同)从我刚才的问题: 替换字符串列表的一些元素的字符串 。 请注意,我不希望在所有列表元素运行正则表达式模式,只有那些到正则表达式应用元素。
我知道最终的结果可以通过交付str_replace
或sub
通过匹配整个字符串被改变,返回由捕获组捕获的文本,如下所示:
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"