【问题标题】:How to match a word after a certain character with out knowing the word in R?如何在不知道 R 中的单词的情况下匹配某个字符之后的单词?
【发布时间】:2016-02-05 03:58:14
【问题描述】:

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

文本示例:

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

我不想在ABC 上执行greplgsub,因为破折号后面的单词总是在变化并且会出现多次。此外,匹配单词前面的单词也总是不同的,并不总是TREE。无论匹配的单词前面是什么单词,我总是想做一个拆分。

如果我执行以下 str_extract:

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

然后我匹配 XYZ 而不是 ABC

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

我不知道该怎么做。如果需要任何进一步的信息,请告诉我。任何帮助将不胜感激。

【问题讨论】:

  • 我看到了各种各样的问题,例如如果后破折号匹配的单词出现多次会发生什么?是否存在您想要拆分匹配词的情况?
  • @Tim 谢谢你的评论我已经编辑了我的问题。但是后破折号匹配的词会出现很多次,无论匹配的词前面的词是什么,我总是想做一个拆分。

标签: regex r gsub stringr grepl


【解决方案1】:

这是一种略显老套的方法。我们称数据为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,因为str_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,因此我们需要在循环使用sapply时更新s

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"

【讨论】:

  • 这非常有效。我决定使用 for 循环。非常感谢。
猜你喜欢
  • 1970-01-01
  • 2021-10-29
  • 1970-01-01
  • 1970-01-01
  • 2015-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多