【问题标题】:Find a word before one of two possible separators在两个可能的分隔符之一之前查找一个单词
【发布时间】:2012-10-02 16:17:14
【问题描述】:
word:12335
anotherword:2323434
totallydifferentword/455
word/32

我需要仅使用基本 R 函数在 :/ 之前获取字符串。我可以使用stringr 做到这一点,但不想在我的包中添加另一个依赖项。单词可以有可变数量的字符,但总是以分隔符(之一)结束。我不需要保留后面的内容。

【问题讨论】:

  • 字符总是字母 a-z 吗?或者他们可以是任何字符?对于正则表达式问题,请尝试提供尽可能多的详细信息。另外,你试过什么?
  • 是的,尽管情况可能混杂,但始终是 alpha。 WoRd.
  • 如果情况混杂,您可能需要[a-zA-z]

标签: regex r


【解决方案1】:

不妨试试:

x <- c("word:12335", "anotherword:2323434", "totallydifferentword/455", "word/32")
lapply(strsplit(x, ":|/"), function(z) z[[1]]) #as a list
sapply(strsplit(x, ":|/"), function(z) z[[1]]) #as a string

gsub 的正则表达式解决方案也可以使用,但根据我遇到类似问题的经验,strsplit 会不那么雄辩,但速度更快。

我想这个正则表达式也可以:

gsub("([a-z]+)([/|:])([0-9]+)", "\\1", x)

在这种情况下 gsub 更快:

Unit: microseconds
        expr    min     lq median     uq     max
1     GSUB() 19.127 21.460 22.392 23.792 106.362
2 STRSPLIT() 46.650 50.849 53.182 54.581 854.162

【讨论】:

  • 谢谢!我不知道您可以在strsplit 中使用分隔符选项。谢谢泰勒!
  • 您可以使用任何正则表达式。
【解决方案2】:

这样的东西可以在 Ruby 中解决问题 http://rubular.com/r/PzVQVIpKPq

^(\w+)(?:[:\/])

从字符串的前面开始,抓取任意单词字符并捕获它们,直到到达非捕获的/:

【讨论】:

    【解决方案3】:

    This regex seems to work。你可以在 R 中使用它吗?

    【讨论】:

    • 在您的答案中始终包含代码是个好主意,因为不能保证您提供的链接将来会在那里。 (一定要留下链接和代码)
    • 这是一个 kewl 链接。名为“Rubular”的它有一个输入框并产生正则表达式的结果(至少无论这个版本的 Ruby 使用什么)。从未见过由 R-regex 引擎驱动的类似页面,但这样的目的地可能有用。 (我通常只在 R 控制台进行测试。)
    【解决方案4】:

    你可以使用包脱胶

    library(unglue)
    x <- c("word:12335", "anotherword:2323434", "totallydifferentword/455", "word/32")
    unglue_vec(x, "{res}{=[:/].*?}")
    #> [1] "word"                 "anotherword"          "totallydifferentword"
    #> [4] "word"
    

    reprex package (v0.3.0) 于 2019 年 10 月 8 日创建

    • {res} 匹配任何内容并返回,相当于{res=.*?}
    • {=[:/].*?} 匹配以 :/ 开头的任何内容,并且不会返回,因为我们没有 = 的 lhs

    【讨论】:

      猜你喜欢
      • 2019-03-22
      • 2021-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多