【问题标题】:R substring based on Regular Expression基于正则表达式的 R 子字符串
【发布时间】:2018-02-25 18:56:03
【问题描述】:

我有这样的字符串:

myString = "2 word1 & 4 word2"
myString = "4 word2"
myString = "2 word1"

我想得到word1之前的数字和word2之前的数字

number1 = 2
number2 = 4

如何在 R 中使用正则表达式

我试过这样的方法,但它只得到第一个数字

 gsub("([0-9]+).*", "\\1", myString)

【问题讨论】:

  • 感谢您的回复。您是说要获得模式中的 2 个数字。问题在于,在像 "4 word2" 或 "2 word1" 这样的字符串中,我不知道它是来自 "word1" 还是 "word2" 。我希望我解释了
  • 好的,使用str_extract_all(myString, "\\d+(?=\\s*word1)")获取word1之前的数字和str_extract_all(myString, "\\d+(?=\\s*word2)")获取word2之前的结果。
  • 太棒了,它就像一个魅力!

标签: r regex dataframe


【解决方案1】:

您可以在特定字符串之前提取特定数字,使用带有前瞻的正则表达式:

> word1_res <- str_extract_all(myString, "\\d+(?=\\s*word1)")
> word1_res
[[1]]
[1] "2"

[[2]]
character(0)

[[3]]
[1] "2"

word2 的结果可以类似地检索:

word2_res <- str_extract_all(myString, "\\d+(?=\\s*word2)")

详情

  • \d+ - 1 个或多个数字...
  • (?=\\s*word2) - 如果紧随其后:
    • \s* - 0+ 个空格
    • word2 - 文字 word2 子字符串。

一个基本的 R 等价物是

regmatches(myString, gregexpr("\\d+(?=\\s*word1)", myString, perl=TRUE))
regmatches(myString, gregexpr("\\d+(?=\\s*word2)", myString, perl=TRUE))

sub 几乎等效的解决方案是

> sub(".*?(\\d+)\\s*word1.*|.*","\\1",myString)
[1] "2" ""  "2"
> sub(".*?(\\d+)\\s*word2.*|.*","\\1",myString)
[1] "4" "4" "" 

请注意,这意味着每个字符串只有一个结果,而str_extract_all 将从字符串中获取所有匹配项。

使用stringr 解决方案和str_extract_all 将任何1+ 位数字块提取为一个完整的单词

library(stringr)
str_extract_all(myString, "\\b\\d+\\b")

或带有regmatches/gregexpr的基本R:

myString <- c("2 word1 & 4 word2", "4 word2", "2 word1")
regmatches(myString, gregexpr("\\b\\d+\\b", myString))

查看online R demo。输出:

[[1]]
[1] "2" "4"

[[2]]
[1] "4"

[[3]]
[1] "2"

详情

  • \b - 单词边界
  • \d+ - 1 位或多位数字
  • \b - 单词边界。

【讨论】:

    【解决方案2】:

    试试

    myString = "2 word1 & 4 word2"
    number1 = gsub("([0-9]+).*", "\\1", myString)
    myString = "4 word2"
    number2 = gsub("([0-9]+).*", "\\1", myString)
    myString = "2 word1"
    number3 = gsub("([0-9]+).*", "\\1", myString)
    print(number1)
    print(number2)
    print(number3)
    

    如果你给 myString 赋值 3 次,myString 将只包含最后一个。

    【讨论】:

      【解决方案3】:

      这会删除每个出现的字母或&符号,可能后跟其他非空格字符,然后扫描剩下的内容。扫描还将它们转换为数字。没有使用任何包。

      myString <- c("2 word1 & 4 word2", "4 word2", "2 word1")
      
      lapply(myString, function(x) scan(text = gsub("[[:alpha:]&]\\S*", "", x), quiet = TRUE))
      

      给予:

      [[1]]
      [1] 2 4
      
      [[2]]
      [1] 4
      
      [[3]]
      [1] 2
      

      【讨论】:

        猜你喜欢
        • 2019-04-02
        • 2010-10-16
        • 1970-01-01
        • 1970-01-01
        • 2020-04-08
        • 2021-10-25
        • 1970-01-01
        相关资源
        最近更新 更多