我试图摆脱第一个连字符之后出现的所有数字/字符。 这里有一些例子:
15-103025-01
800-40170-02
68-4974-01
我想要的输出:
15-
800-
68-
我已阅读过这样的帖子:
但它们不是我正在寻找的东西,因为那些中提到的方法也会摆脱我的连字符(只留下前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)
但并没有按照我的预期真正发挥作用。
答案 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])