1

我有看起来像这样的字符串。

x <- c("P2134.asfsafasfs","P0983.safdasfhdskjaf","8723.safhakjlfds") 

我需要结束:

"2134", "0983", and "8723"

本质上,我需要从每个元素中提取作为数字的前四个字符。有些以字母开头(不允许我使用简单的 substring() 函数)。

我想从技术上讲,我可以做类似的事情:

x <- gsub("^P","",x)
x <- substr(x,1,4)

但我想知道如何使用正则表达式来做到这一点!

4

4 回答 4

4

您可以使用包中的str_matchstringr

library(stringr)
print(c(str_match(x, "\\d\\d\\d\\d")))
# [1] "2134" "0983" "8723"
于 2012-12-17T21:15:08.840 回答
3

你也可以这样做gsub

> sub('.?([0-9]{4}).*', '\\1', x)
[1] "2134" "0983" "8723"
> 

我用sub而不是gsub确保我只得到了第一场比赛。 .?表示任何单个字符及其可选字符(类似于 just.但如果没有前导它不会匹配大小写P)。()表示我在替换中引用的组'\\1'。如果有多组,()我也可以使用'\\2'. 在组内,你的语法是正确的,我只想要数字,我想要其中的 4 个。最后一段说零个或多个任何类型的尾随字符。

你的语法是有效的,但是你用它自己替换了一些东西,所以你最终得到了相同的输出。

于 2012-12-17T21:18:25.907 回答
1

这将为您提供字符串的前四位数字,无论它们出现在字符串中的哪个位置。

mapply(function(x, m) paste0(x[m], collapse=""), 
        strsplit(x, ""),
        lapply(gregexpr("\\d", x), "[", 1:4))

把它分解成碎片:

上述行中发生的情况如下:

# this will get you a list of matches of digits, and their location in each x
matches <- gregexpr("\\d", x)

# this gets you each individual digit
matches <- lapply(matches, "[", 1:4)

# individual characters of x
splits <- strsplit(x, "")

# get the appropriate string
mapply(function(x, m) paste0(x[m], collapse=""), splits, matches)
于 2012-12-17T21:25:25.277 回答
0

另一种不假设 4 个数字的组捕获方法。

x <- c("P2134.asfsafasfs","P0983.safdasfhdskjaf","8723.safhakjlfds") 

gsub("(^[^0-9]*)(\\d+)([^0-9].*)", "\\2", x)

## [1] "2134" "0983" "8723"
于 2015-05-13T00:46:50.107 回答