【问题标题】:Splitting strings into elements from a list将字符串拆分为列表中的元素
【发布时间】:2018-09-06 13:40:31
【问题描述】:

包中的函数给了我一个字符,其中原始字符串合并在一起。我需要将它们分开,换句话说,我必须找到原始元素。这是一个示例以及我尝试过的方法:

orig<-c("answer1","answer2","answer3")
result<-"answer3answer2"

我需要的结果是:

c("answer2","answer3")

我尝试过 split() 结果,但没有字符串可以作为它的依据,尤其是我以前不知道答案是什么。

我已尝试将结果匹配()到原点,但我需要对所有子字符串执行此操作。

必须有一个简单的解决方案,但我还没有找到。

【问题讨论】:

  • 不一定是可逆的过程。例如,如果您的原始集是 c("ab", "cde", "abc", "de") 那么您根本无法知道字符串 "abcde" 是否是 ("ab" 和 "cde" 的结果) 或 ("abc" 和 "de")。您会对将所有这四个选项都列为选项的解决方案感到满意吗?如果是这样,我应该能够提出一些建议。 (在现实世界的情况下,这可能重要也可能不重要 - 对于单个单词的列表,它肯定重要 - 这是某些古代语言翻译困难的原因之一,因为它们不使用空格!)
  • 这样可以吗? unlist(strsplit(result, "(?&lt;=[\\d+])", perl = TRUE)) - 取自 this answer
  • “我已经尝试将结果匹配()到 orig”:你的意思是 orig 可用?

标签: r string


【解决方案1】:
index <- gregexpr(paste(orig,collapse='|'),result)[[1]]
starts <- as.numeric(index)
stops <- starts + attributes(index)$match.length - 1 )
substring(result, starts, stops)

这应该适用于定义明确且可逆的输入。或者,是否可以在函数的输入中附加一些字符串,以便之后可以轻松分离?

【讨论】:

  • 它确实有效,但我可能会采用在开头和结尾附加 *-s 的安全解决方案,好主意!
【解决方案2】:

您所描述的似乎完全是字符串匹配,而对于您的字符串,grepl 似乎就是这样,特别是:

FindSubstrings <- function(orig, result){
  orig[sapply(orig, grepl, result)]
}

更详细地说:grepl 接受一个pattern 参数并查看它是否出现在您的字符串中(在我们的例子中为result),并返回一个TRUE/FALSE 值。我们通过逻辑向量对原始值进行子集化 - 值是否出现在字符串中?
可能的改进:

  • fixed=TRUE 可能是个好主意,因为您不需要完整的正则表达式功能来进行简单的字符串匹配
  • 某些匹配模式可能包含其他匹配模式,例如"answer10" 包含"answer1"
  • stringi 对于此类任务可能更快(只是谣言四处流传,尚未经过严格测试),因此如果您经常这样做,您可能需要研究一下。

【讨论】:

  • 你的答案很优雅,我认为在大多数情况下,我的答案不会相互包含,但我会安全并在输入中添加字符以进行分隔。
猜你喜欢
  • 2014-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-16
  • 1970-01-01
  • 2019-04-16
  • 1970-01-01
  • 2021-11-30
相关资源
最近更新 更多