首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在字符串中查找由"/“分隔的重复单词

在字符串中查找由"/“分隔的重复单词
EN

Stack Overflow用户
提问于 2016-02-23 14:37:55
回答 2查看 1.2K关注 0票数 2

假设以下向量:

代码语言:javascript
代码运行次数:0
运行
复制
x <- c("/default/img/irs/irs/irs/irs/irs/irs/irs/irs/irs/irs/irs/irs/IRS.html/", "something/repeat/repeat_this")

我想检查一个由/括起来的单词是否被重复(注意,/可能在字符串的开始和结束中丢失)。我发现了下面的正则表达式here,但是(在我去掉特殊字符之后)我似乎无法修改它以适应我的情况:

代码语言:javascript
代码运行次数:0
运行
复制
grepl("\\b(\\S+?)\\1\\S*\\b", x, perl = TRUE)
# [1] TRUE TRUE 

我总是可以str_split(x, "/")并在列表上迭代duplicated()函数,并使用if()语句,但这将是非常低效率的。

期望的结果应该是带有TRUE或FALSE (或1和0)的向量。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-02-23 14:47:36

我想以下几点可能对你有用。首先,fixed = TRUEstrsplit()中绕过正则表达式引擎,直接进行精确匹配,从而使函数速度更快。接下来,anyDuplicated()返回一个长度为一个整数的结果,如果没有找到重复项,它将是零,否则返回大于零的结果。因此,我们可以使用strsplit()拆分字符串,并对结果迭代anyDuplicated()。然后,我们可以比较得到的向量与零。

代码语言:javascript
代码运行次数:0
运行
复制
vapply(strsplit(x, "/", fixed = TRUE), anyDuplicated, 1L) > 0L
# [1]  TRUE FALSE

为了安全起见,您可能希望删除任何前导/,因为它将在strsplit()的结果中生成一个空字符,并且在某些情况下可能会产生误导性结果(例如,字符串以/irs//irs开头或类似的情况在字符串后面发生)。您可以使用sub("^/", "", x)删除前导正斜杠。

总之,使您的strsplit()想法更快的方法是:

  • fixed = TRUE中使用strsplit()绕过正则表达式引擎
  • 使用anyDuplicated(),因为它不再照看它找到一个匹配的
  • 使用vapply(),因为我们知道结果的类型和长度
票数 6
EN

Stack Overflow用户

发布于 2016-02-24 17:25:22

其他解决方案--如果您只想检查您的模式

代码语言:javascript
代码运行次数:0
运行
复制
grepl(x, pattern = "((.+)/).*(/\\2(/|$))", perl=T)

如果(.+)表示出现在斜杠前面的单词本身(捕获组2),则.*允许在两个相等的子字符串之间出现任意长度的字符、数字和空格。然后,如果该单词发生在斜杠之后,然后是另一个斜杠或字符串的末尾( (/\\2(/|$)) ),则匹配。

对于提取,您可以使用上面详细阐述的strsplit()。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35580382

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档