在R中提取混合数字和字符的字符串的数字部分

时间:2013-03-16 15:50:47

标签: string r

我有很多字符串,每种字符串都有以下格式:Ab_Cd-001234.txt 我想用001234替换它。我怎样才能在R中实现它?

5 个答案:

答案 0 :(得分:24)

stringr包有很多方便的快捷方式用于此类工作:

# input data following @agstudy
data <-  c('Ab_Cd-001234.txt','Ab_Cd-001234.txt')

# load library
library(stringr)

# prepare regular expression
regexp <- "[[:digit:]]+"

# process string
str_extract(data, regexp)

Which gives the desired result:

  [1] "001234" "001234"

稍微解释一下regexp:

[[:digit:]]是0到9之间的任何数字

+表示前一项(在本例中为数字)将匹配一次或多次

此页面对于此类字符串处理也非常有用:http://en.wikibooks.org/wiki/R_Programming/Text_Processing

答案 1 :(得分:21)

使用gsubsub即可:

 gsub('.*-([0-9]+).*','\\1','Ab_Cd-001234.txt')
"001234"

您可以将regexprregmatches

一起使用
m <- gregexpr('[0-9]+','Ab_Cd-001234.txt')
regmatches('Ab_Cd-001234.txt',m)
"001234"

编辑这两个方法是矢量化的,适用于字符串向量。

x <- c('Ab_Cd-001234.txt','Ab_Cd-001234.txt')
sub('.*-([0-9]+).*','\\1',x)
"001234" "001234"

 m <- gregexpr('[0-9]+',x)
> regmatches(x,m)
[[1]]
[1] "001234"

[[2]]
[1] "001234"

答案 2 :(得分:4)

您可以使用qdap包中的genXtract。这将采用左字符串和右字符串,并在。之间提取元素。

library(qdap)
genXtract("Ab_Cd-001234.txt", "-", ".txt")

虽然我更喜欢agstudy的答案。

编辑扩展答案以匹配agstudy:

x <- c('Ab_Cd-001234.txt','Ab_Cd-001234.txt')
genXtract(x, "-", ".txt")

# $`-  :  .txt1`
# [1] "001234"
# 
# $`-  :  .txt2`
# [1] "001234"

答案 3 :(得分:2)

gsub 删除前缀和后缀:

gsub(".*-|\\.txt$", "", x)

工具包使用工具中的file_path_sans_ext删除扩展程序,然后使用sub删除前缀:

library(tools)
sub(".*-", "", file_path_sans_ext(x))

strapplyc 在点之前和之前提取数字。有关详细信息,请参阅gsubfn home page

library(gsubfn)
strapplyc(x, "-(\\d+)\\.", simplify = TRUE)

请注意,如果需要返回数字,我们可以使用strapply而不是strapplyc,如下所示:

strapply(x, "-(\\d+)\\.", as.numeric, simplify = TRUE)

答案 4 :(得分:0)

我添加此答案是因为无论您要清理的字符串中有哪些非数字字符,它都有效,并且因为 OP 表示字符串 倾向于 遵循格式“ Ab_Cd-001234.txt”,我认为这意味着允许变化。

请注意,此答案从字符串中提取所有数字字符并将它们保存在一起,因此如果字符串是“4_Ab_Cd_001234.txt”,您的结果将是“4001234”。

如果您想将您的解决方案指向您拥有的数据框中的一列,

df$clean_column<-gsub("[^0-9]", "", df$dirty_column)

这与这里的答案非常相似: https://stackoverflow.com/a/52729957/9731173

本质上,您对我的解决方案所做的是用“”替换任何非数字字符,而我链接到的答案替换任何非数字字符,-或。