29

我有很多字符串,每个字符串都倾向于具有以下格式:Ab_Cd-001234.txt 我想将其替换为001234. 我怎样才能在 R 中实现它?

4

5 回答 5

35

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"

稍微解释一下正则表达式:

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

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

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

于 2013-03-17T03:35:27.250 回答
28

使用gsub或者sub你可以这样做:

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

你可以regexpr使用regmatches

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

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

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"
于 2013-03-16T15:57:39.570 回答
4

您可以genXtract从 qdap 包中使用。这需要一个左字符串和一个右字符串并提取它们之间的元素。

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"
于 2013-03-16T16:05:20.083 回答
2

gsub 删除前缀和后缀:

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

工具包 使用file_path_sans_extfrom tools 删除扩展名,然后使用sub删除前缀:

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

strapplyc 提取点之后和之前的数字。有关更多信息,请参见gsubfn 主页

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

请注意,如果希望返回一个数字,我们可以使用strapply而不是strapplyc这样:

strapply(x, "-(\\d+)\\.", as.numeric, simplify = TRUE)
于 2013-03-21T13:54:19.600 回答
1

我添加了这个答案,因为无论您要清理的字符串中有哪些非数字字符,它都可以工作,并且因为 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 。

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

于 2021-06-21T18:16:33.923 回答