【问题标题】:Keep only numbers before the FIRST hyphen AND the hyphen itself在第一个连字符和连字符本身之前只保留数字
【发布时间】:2016-09-26 08:27:23
【问题描述】:

我正在尝试删除第一个连字符之后出现的所有数字/字符。 这里有一些例子:

15-103025-01
800-40170-02
68-4974-01

我想要的输出:

15-
800-
68-

我读过这样的帖子:

  1. Using gsub to extract character string before white space in R
  2. truncate string from a certain character in R
  3. Truncating the end of a string in R after a character that can be present zero or more times

但它们不是我想要的,因为其中提到的方法也会去掉我的连字符(只留下前 2 或 3 个数字)。

这是我迄今为止尝试过的:

gsub(pattern = '[0-9]*-$', replacement = "", x = data$id)
grep(pattern = '[0-9]*-', replacement = "", x = data$id)
regexpr(pattern = '[0-9]*-', text = data$id)

但并没有像我预期的那样真正工作。

【问题讨论】:

  • sub("(?<=-).*", "", x, perl = TRUE) 怎么样,使用sub() 表示- 的第一次出现,(?<=-) 用于积极的向后看以保留-,并使用.* 删除其后的所有内容.
  • 嗨@RichardScriven 你能解释一下每个组件的含义吗?比如 "(?
  • 刷新以查看我更新的评论
  • @RichardScriven 它有效!太感谢了!所以你说 sub() 只能用于第一个连字符?如果我现在想使用第二个连字符作为指南呢???
  • 那就更难了:)

标签: regex r


【解决方案1】:

实现这一点的几种方法,这里是一种:

have <- c("15-103025-01", "800-40170-02", "68-4974-01")
want <- sub(pattern = "(^\\d+\\-).*", replacement = "\\1", x = have)

因此,在您的正则表达式中,您将使用()'s 创建一个组,它与字符串的开头 (^) 后跟一个或多个数字 (\\d+) 和连字符 ( \\-)。组外是后面的任何其他字符 (.*)。

在替换部分,您指定\\1 来引用正则表达式的第一个(也是唯一一个)组。不添加任何其他内容意味着删除所有其他内容。

【讨论】:

  • 嗨,感谢您的帮助!你能解释一下“(^\\d+\\-).*”和“\\1”是什么意思吗?
  • 不客气。请查看我的编辑以回答您的问题。
【解决方案2】:

为什么不只是,

sub('-.*', '-', x)
#[1] "15-"  "800-" "68-"

然后对第二个连字符做同样的事情,

sub('-([^-]*)$', '-', x)
#[1] "15-103025-" "800-40170-" "68-4974-"

【讨论】:

  • 这将保证找到第一个连字符??
  • @alwaysaskingquestions,是的。它将用连字符替换第一个连字符之后的所有内容。
  • 这实际上是一个非常聪明的方法......如果我想用这个找到第二个连字符怎么办?
  • hi sotos(由于某种原因无法标记您),非常感谢您的编辑!你能解释一下括号内你在做什么吗??
【解决方案3】:

与 stringr 的替代品,据说向量的名称是 x

library(stringr)
str_sub(x,1,str_locate(x,"-")[ ,1])

这部分作为字符串的参数向量,在这种情况下返回匹配模式的位置“-”在字符串中

str_locate(x,"-")

所以这段代码将返回开始和结束位置的矩阵,在这种情况下,它们是相同的数字,因为“-”只是在相同位置开始和结束的一个字符

     start end
[1,]     3   3
[2,]     4   4
[3,]     3   3

当我们以这种方式进行子集化时

str_locate(x,"-")[ ,1]

我们得到

[1] 3 4 3

现在函数 str_sub 获取整个字符串的子字符串,我们指定子字符串的开始和结束位置。 所以基本上它读作向量 x 的所有元素创建一个从字符 1 开始并在第一个破折号的位置结束的子字符串,如前所示。

str_sub(x,1,str_locate(x,"-")[ ,1])

【讨论】:

  • 嗨 Tomas,感谢您的帮助!想知道您是否可以解释更多您提出的论点?例如,您的代码中的两个“1”是什么?这个比例也可以定位第二个连字符吗?
  • 嗨,我编辑了答案来解释它。关于第二个连字符肯定可以做任何事情。但我不知道您是否想要从开始到第二个破折号的字符串或从第一个破折号到第二个破折号的数字
  • 在阅读了您的解释后,我想我现在对它的理解要好得多,我想我可以将它缩放到自己进行第 1 次冲刺到第 2 次冲刺。非常感谢!
猜你喜欢
  • 2019-12-16
  • 1970-01-01
  • 1970-01-01
  • 2011-12-04
  • 1970-01-01
  • 2016-02-18
  • 2022-08-04
  • 1970-01-01
相关资源
最近更新 更多