【问题标题】:extracting before digits before and after forward slash /在正斜杠之前和之后提取数字之前/
【发布时间】:2019-03-28 16:28:53
【问题描述】:

我无法提取/ 之前和之后的字符串。

x <- c("maximusa/b=5/1","maximusa/b=-4/1","maximusa/b=3/-2")

before_slash=sub(".*=(\\d+).*","\\1", x, perl = TRUE)

给了

"5"               "maximusa/b=-4/1" "3"

然后

after_slash=sub("^.*\\/(d+)","\\1", x, perl = TRUE)

给予

"maximusa/b=5/1"  "maximusa/b=-4/1" "maximusa/b=3/-2"

OTH,预期输出

在斜线 5 -4 3 之前

斜线后 1 1 -2

我怎样才能得到预期的输出?

谢谢解答,

我想再添加一个条件来提取字符串 假设我们有这样的字符串。 与 OP 一样,我们如何使用 + 符号提取并忽略括号? @mob 的当前解决方案给出了

  x <- c("maximusa/b=(5/+1)","maximusa/b=(-4/1)","maximusa/b=(+3/-2)")

after_slash=sub("^.*/(\\d+)","\\1", x, perl = TRUE)
> after_slash
[1] "maximusa/b=(5/+1)"  "1)"                 "maximusa/b=(+3/-2)"

 before_slash=sub(".*=(-?\\d+).*","\\1", x, perl = TRUE)

  > before_slash
[1] "maximusa/b=(5/+1)"  "maximusa/b=(-4/1)"  "maximusa/b=(+3/-2)"

我尝试了一些,但没有运气!

【问题讨论】:

  • @mob 我编辑了问题标题。谢谢

标签: r regex perl


【解决方案1】:

一个问题是

after_slash=sub("^.*\\/(d+)","\\1", x, perl = TRUE)

应该是

after_slash=sub("^.*/(\\d+)","\\1", x, perl = TRUE)

要捕获负整数,您还需要使用

before_slash=sub(".*=(-?\\d+).*","\\1", x, perl = TRUE)
after_slash=sub("^.*/(-?\\d+)","\\1", x, perl = TRUE)

标记-? 表示“- 字符,0 或 1 次”

【讨论】:

  • 如果我也有这样的括号怎么办? x &lt;- c("maximusa/b=(5/1)","maximusa/b=(-4/1)","maximusa/b=(3/-2)")
  • 我也忘了提到我在数字前还有+ 符号。 x &lt;- c("maximusa/b=(5/+1)","maximusa/b=(-4/1)","maximusa/b=(+3/-2)")
【解决方案2】:

我们可以使用str_extract_all 匹配-(如果有)后跟一个或多个数字([0-9]+)并将其类型更改为numeric

library(tidyverse)
map_dfc(str_extract_all(x, "-?[0-9]+"), as.numeric)
# A tibble: 2 x 3
#    V1    V2    V3
#  <dbl> <dbl> <dbl>
#1     5    -4     3
#2     1     1    -2

或者在用sub得到子串后用read.table指定sep/创建一个两列data.frame

read.table(text= sub(".*=", "", x), sep="/")
#   V1 V2
#1  5  1
#2 -4  1
#3  3 -2

或者另一个选项是strsplit

sapply(strsplit(x, "[=/]"), `[`, 3:4)

更新

如果 OP 的字符串也有(),第一个选项应该可以正常工作,但是在第二个选项中,我们可以更改

x1 <- c("maximusa/b=(5/1)","maximusa/b=(-4/1)","maximusa/b=(3/-2)")
read.table(text= gsub(".*=|[()]", "", x1), sep="/")
#  V1 V2
#1  5  1
#2 -4  1
#3  3 -2

【讨论】:

    【解决方案3】:

    这也应该有效。

    matrix(as.numeric(unlist(strsplit(
      gsub("(^\\w*\\/)(b=)(-?\\d)(\\/)(-?\\d$)", "\\3 \\5", x), " "))), 2)
    #      [,1] [,2] [,3]
    # [1,]    5   -4    3
    # [2,]    1    1   -2
    

    【讨论】:

      猜你喜欢
      • 2019-07-17
      • 1970-01-01
      • 1970-01-01
      • 2021-11-18
      • 1970-01-01
      • 2018-07-31
      • 1970-01-01
      • 2019-01-13
      • 1970-01-01
      相关资源
      最近更新 更多