> grep("[0-9]+", "aaa12xxx", value=TRUE)
[1] "aaa12xxx"
然后我想到了...
> sub("[0-9]+", "\\1", "aaa12xxx")
[1] "aaaxxx"
但我做了一些事情,得到了某种形式的回应:
> sub("[0-9]+", "ARGH!", "aaa12xxx")
[1] "aaaARGH!xxx"
我忽略了一个小细节。
使用新的stringr包,它将所有现有的正则表达式操作封装在一个一致的语法中,并添加了一些缺失的内容:
library(stringr)
str_locate("aaa12xxx", "[0-9]+")
# start end
# [1,] 4 5
str_extract("aaa12xxx", "[0-9]+")
# [1] "12"
说“忽略标准函数”可能有点仓促——?gsub
的帮助文件甚至在“另请参见”中特别提到:
基于'regexpr'、'gregexpr'和'regexec'的结果提取匹配子字符串的'regmatches'。
因此,以下方法可行且相当简单:
txt <- "aaa12xxx"
regmatches(txt,regexpr("[0-9]+",txt))
#[1] "12"
regmatches(x, gregexpr("[0-9]+", x))
- 就像sub
用于一次替换,gsub
用于所有替换一样,regexpr
找到一个结果,而gregexpr
找到所有结果。 - thelatemail对于你的特定情况,你可以删除所有非数字字符:
gsub("[^0-9]", "", "aaa12xxxx")
# [1] "12"
在更复杂的情况下它不会起作用。
gsub("[^0-9]", "", "aaa12xxxx34")
# [1] "1234"
您可以使用Perl正则表达式的懒惰匹配:
> sub(".*?([0-9]+).*", "\\1", "aaa12xx99",perl=TRUE)
[1] "12"
尝试替换非数字字符将导致错误,但在这种情况下不会。在正则表达式中使用捕获括号和组引用替换。括号内的任何内容都会被记住。然后通过\2访问第一个项目。第一个反斜杠转义了R中反斜杠的解释,以便将其传递给正则表达式解析器。
gsub('([[:alpha:]]+)([0-9]+)([[:alpha:]]+)', '\\2', "aaa12xxx")
test <- regexpr("[0-9]+","aaa12456xxx")
现在,请注意regexpr给出了字符串的起始和结束索引:
> test
[1] 4
attr(,"match.length")
[1] 5
substr("aaa12456xxx",test,test+attr(test,"match.length")-1)
我相信有更优雅的方法完成这个任务,但是这是我能找到的最快捷的方式。或者,你可以使用sub/gsub函数来去除不需要的内容以保留你想要的内容。
这些方法之间一个重要的区别是在没有匹配项的情况下的行为。例如,如果所有位置都没有匹配项,regmatches方法可能不会返回与输入相同长度的字符串。
> txt <- c("aaa12xxx","xyz")
> regmatches(txt,regexpr("[0-9]+",txt)) # could cause problems
[1] "12"
> gsub("[^0-9]", "", txt)
[1] "12" ""
> str_extract(txt, "[0-9]+")
[1] "12" NA
这个问题的解决方案
library(stringr)
str_extract_all("aaa12xxx", regex("[[:digit:]]{1,}"))
# [[1]]
# [1] "12"
[[:digit:]]: 数字 [0-9]
{1,}: 至少匹配1次
另一种解决方案:
temp = regexpr('\\d', "aaa12xxx");
substr("aaa12xxx", temp[1], temp[1]+attr(temp,"match.length")[1])
在 gsubfn 包中使用 strapply。strapply 类似于 apply,它的参数是对象、修改器和函数,除了对象是字符串向量(而不是数组)以外,修饰符是正则表达式(而不是边缘):
library(gsubfn)
x <- c("xy13", "ab 12 cd 34 xy")
strapply(x, "\\d+", as.numeric)
# list(13, c(12, 34))
这里的意思是在 x 的每个组件中匹配一个或多个数字 (\d+),并将每个匹配项转换为数字形式 .numeric。它返回一个列表,其组件是各自组件的匹配向量。从输出结果来看,我们可以看到 x 的第一个组件有一个匹配项,即 13,而 x 的第二个组件有两个匹配项,分别是 12 和 34。更多信息请参见 http://gsubfn.googlecode.com。
?str_extract
时,我看到了str_extract_all
,生活又变得美好了。 - dwanderson