1

我想-在我的文本中匹配 a 之后的单词,然后如果匹配的单词是另一个单词的结尾,那么我想在单词和匹配的单词之间进行拆分。

文本示例:

JOHN LION - XYZ RAN RUN TREEABC GRASS - ABC LIMB RAN RUN LION -XYZ JOG SUN
SKY - ABC LION JOHN PONDABC RUN - PDF STONE

我希望文本看起来像什么:

JOHN LION - XYZ RAN RUN TREE ABC GRASS - ABC LIMB RAN RUN LION -XYZ JOG SUN
SKY - ABC LION JOHN POND ABC RUN - PDF STONE

我不想做 agrepl和 a gsubonABC因为破折号后面的词总是在变化并且会出现多次。此外,匹配单词前面的单词也将始终不同,但并不总是如此TREE。无论匹配的单词前面是什么单词,我总是想做一个拆分。

如果我执行以下 str_extract:

str_extract(df, "(?<=-\\s)\\w+")

那我XYZ不配ABC

我只想匹配-if 之后的单词,它也在另一个单词的末尾,但是我又不知道那个单词会是什么。

我被困在做什么。如果需要任何进一步的信息,请告诉我。任何帮助将不胜感激。

4

1 回答 1

3

这是一种温和的hacky方式。让我们调用数据s

s <- 'JOHN LION - XYZ RAN RUN TREEABC GRASS - ABC LIMB RAN RUN LION -XYZ JOG SUN SKY - ABC LION JOHN PONDABC RUN - PDF STONE'

使用stringr,让我们使用您现有的正则表达式来提取要匹配的模式:

library(stringr)
pat <- str_extract_all(s, "(?<=-\\s)\\w+")

使用这些模式来查找模式之前和之后有空格的所有非空白字符的单词(即需要空格的单词):

words <- str_extract_all(s, paste0('[A-Za-z0-9]+', pat[[1]], '\\s'))

通过将模式替换为空格,然后是模式,在这些单词中插入空格。要一次完成所有操作,您需要使用lapply, asstr_extract_all生成一个列表。

words2 <- lapply(1:length(words), function(x){           # a little hacky
  str_replace_all(words[[x]], pat[[1]][x], paste0(' ', pat[[1]][x]))
})

要将所有匹配的单词替换为固定的单词,我们需要运行str_replace_all每个单词并进行替换,因此我们需要s在循环时更新sapply

sapply(1:length(words), function(x){                               # hacky
  s <<- str_replace_all(s, unlist(words)[x], unlist(words2)[x])    # hackier
})

这将产生一些无用的输出,但更新s,或使用for循环,这有点干净:

for(x in 1:length(words)){
  s <- str_replace_all(s, unlist(words)[x], unlist(words2)[x])
}

不管怎样,我们得到

> s
[1] "JOHN LION - XYZ RAN RUN TREE ABC GRASS - ABC LIMB RAN RUN LION -XYZ JOG SUN SKY - ABC LION JOHN POND ABC RUN - PDF STONE"
于 2016-02-05T05:18:38.470 回答