/之间提取字符串

use*_*502 18 regex r

如果我有这些字符串:

mystrings <- c("X2/D2/F4",
               "X10/D9/F4",
               "X3/D22/F4",
               "X9/D22/F9")
Run Code Online (Sandbox Code Playgroud)

我怎样才能提取出来2,9,22,22.这些字符/位于第一个字符之间和之后/.

我想以矢量化方式执行此操作,并添加新列,transfrom如果可能的话,我熟悉它.

我认为这个正则表达式让我在附近的所有角色附近\:

^.*\\'(.*)'\\.*$
Run Code Online (Sandbox Code Playgroud)

42-*_*42- 29

> gsub("(^.+/[A-Z]+)(\\d+)(/.+$)", "\\2", mystrings)
[1] "2"  "9"  "22" "22"
Run Code Online (Sandbox Code Playgroud)

您将"读取"(或"解析")正则表达式模式将任何匹配的字符串拆分为三个部分:

1)任何包括第一个正斜杠后跟一系列大写字母的东西,

2)在下一个斜杠之前的序列中的任何数字(="\ d"),

3)从下一个斜线到结束.

然后只返回第二部分....

不匹配的字符串将不加改变地返回.

  • +1我不知道你可以在没有第二组的情况下用'\\ 2`获得第二组比赛!油滑. (2认同)

Aru*_*run 20

as.numeric(gsub("^.*D([0-9]+).*$", "\\1", mystrings))


Mat*_*rde 8

str_extractstringr包中使用:

as.numeric(str_extract(mystrings, perl('(?<=/[A-Z])[0-9]+(?=/)')))
Run Code Online (Sandbox Code Playgroud)

  • @rrs这是一个后视断言的一部分.在R提示符下键入`?regex`并阅读"Perl-like Regular Expressions"部分的最后几段. (2认同)

Rom*_*rik 8

@Arun偷了我的雷声,所以我给出了我最初的啰嗦的例子.

cut.to.pieces <- strsplit(mystrings, split = "/")
got.second <- lapply(cut.to.pieces, "[", 2)
get.numbers <- unlist(got.second)
as.numeric(gsub(pattern = "[[:alpha:]]", replacement = "", x = get.numbers, perl = TRUE))
[1]  2  9 22 22
Run Code Online (Sandbox Code Playgroud)