仅保留FIRST连字符和连字符本身之前的数字

时间:2016-05-27 22:08:44

标签: regex r

我试图摆脱第一个连字符之后出现的所有数字/字符。 这里有一些例子:

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
  4. 但它们不是我正在寻找的东西,因为那些中提到的方法也会摆脱我的连字符(只留下前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)
    

    但并没有按照我的预期真正发挥作用。

3 个答案:

答案 0 :(得分:6)

实现这一目标的几种方法,一个是:

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

因此,在正则表达式中,您将使用()创建一个组,该组匹配字符串的开头(^),后跟一个或多个数字({{1} })和连字符(\\d+)。在群组外面是其后的任何其他角色(\\-)。

在替换部分中,指定.*以引用正则表达式的第一个(也是唯一的)组。不添加任何其他内容意味着放弃所有其他内容。

答案 1 :(得分:3)

为什么不呢,

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

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

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

答案 2 :(得分:2)

替代stringr,据说vector的名称是x

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

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

str_locate(x,"-")

因此,此代码将返回起始位置和结束位置的矩阵,在这些情况下是相同的数字,因为&#34; - &#34;只有一个字符在同一位置开始和结束

     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])