【问题标题】:R grepl variable comparisonR grepl 变量比较
【发布时间】:2014-01-30 03:44:21
【问题描述】:

只是需要grepl 的帮助,这让我很头疼!

我有两个变量:

str1<-"AAV.L"
str2<-"AAV2.L"

我想要做的是检查str2 是否是str1 的扩展(在这种情况下就是这样)。基本上这里str2 的名称中有一个额外的"2"..

理想的解决方案是这样的:

grepl(str1,paste0(str2,...))

但我不知道在str1 中解释.。变量的长度也不一样,所以我不能只检查str1 的前三个字符是否存在于str2 中。

有人有什么想法吗?

谢谢!

编辑 - 澄清..

基本上,“扩展”是指如果一个变量包含完全相同的字母,甚至更多,以相同的顺序。所以上面的例子,AAV.LAAV2.L 会匹配,因为它包含AAV..L。它不一定是这样的,但它应该匹配 REWRREWRLE 以及 REWR..

所以c("AAV.LE", "BAAV.L","AABV.L","AAV..L","ABCAV.L"),没有一个匹配。如果我要将匹配规则用简单的英语写成:

str2 是否以 str1 开头或 str2 是否以 str1 的任何子集开头并结束与另一个子集?

我查看了agrep,但它的匹配太不准确了。例如AAV.LAAV2.L 匹配很好,但是ADDAPUAD 也匹配,这是不正确的!我知道我可以指定max.distance,但有些字符串可能是ADDADDDDDDDDD,这会使设置这个值不可信..

如果这有帮助,请告诉我。

【问题讨论】:

  • 你能更好地说明问题吗?您如何准确定义一个字符串是否是另一个字符串的“扩展”?
  • 另外,你必须使用grepl吗?根据您对我上一条评论的回答,我认为不使用正则表达式可能更容易。
  • -1 并投票结束:您没有提供足够的示例或解释来唯一确定您想要什么。 c("AAV.LE", "BAAV.L","AABV.L","AAV..L","ABCAV.L") 中的什么应该匹配?你可能想看看agrep
  • 如果您更准确地编辑您的问题,我将提名重新提出问题。
  • 对不起,伙计们,赶时间和假期!我已编辑问题以获得更多说明。

标签: r regex string string-comparison


【解决方案1】:

您可以在放入 grepl 之前删除点扩展。

str1 <- sub("\\.[[:alnum:]]+$", "", str1);
## AAV

str2 <- sub("\\.[[:alnum:]]+$", "", str2);
## AAV2

注意:这是一种删除文件扩展名的方法。它不会删除点字符的任何其他出现。它的工作原理是替换出现的句点,后面跟着字母数字字符,并从字符串的末尾开始搜索。它用空 ("") 字符串替换它。

str3 <- "A.A.V.L"
str3 <- sub("\\.[[:alnum:]]+$", "", str3);
## A.A.V

然后,使用 grepl

grepl(str1, str2)
## TRUE

【讨论】:

  • 嗨@DashAnimal,感谢您的回答。不知道这对于大量比较和更大的字符串是否真的很实用。编辑过的问题,也许它会帮助产生一个新的答案?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-23
  • 1970-01-01
  • 2014-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多