我正在尝试从字符串中提取数字.
并做一些类似于[0-9]+字符串"aaa12xxx"和得到的东西"12".
我以为它会是这样的:
> grep("[0-9]+", "aaa12xxx", value=TRUE)
[1] "aaa12xxx"
Run Code Online (Sandbox Code Playgroud)
然后我想...
> sub("[0-9]+", "\\1", "aaa12xxx")
[1] "aaaxxx"
Run Code Online (Sandbox Code Playgroud)
但我做了某种形式的回应:
> sub("[0-9]+", "ARGH!", "aaa12xxx")
[1] "aaaARGH!xxx"
Run Code Online (Sandbox Code Playgroud)
我缺少一个小细节.
had*_*ley 156
使用新的stringr包,它包装所有现有的正则表达式,以一致的语法运行,并添加一些缺少的:
library(stringr)
str_locate("aaa12xxx", "[0-9]+")
# start end
# [1,] 4 5
str_extract("aaa12xxx", "[0-9]+")
# [1] "12"
Run Code Online (Sandbox Code Playgroud)
the*_*ail 78
说" 忽略标准函数 " 可能有点仓促- ?gsub甚至在"另请参见"中特别引用的帮助文件:
'regmatches'用于根据'regexpr','gregexpr'和'regexec'的结果提取匹配的子串.
所以这会起作用,而且相当简单:
txt <- "aaa12xxx"
regmatches(txt,regexpr("[0-9]+",txt))
#[1] "12"
Run Code Online (Sandbox Code Playgroud)
Jyo*_*rya 14
你可以使用PERL正则表达式的懒惰匹配:
> sub(".*?([0-9]+).*", "\\1", "aaa12xx99",perl=TRUE)
[1] "12"
Run Code Online (Sandbox Code Playgroud)
在这种情况下,尝试替换非数字会导致错误.
一种方法是这样的:
test <- regexpr("[0-9]+","aaa12456xxx")
Run Code Online (Sandbox Code Playgroud)
现在,请注意 regexpr 为您提供字符串的开始和结束索引:
> test
[1] 4
attr(,"match.length")
[1] 5
Run Code Online (Sandbox Code Playgroud)
因此,您可以将该信息与 substr 函数一起使用
substr("aaa12456xxx",test,test+attr(test,"match.length")-1)
Run Code Online (Sandbox Code Playgroud)
我确信有一种更优雅的方法可以做到这一点,但这是我能找到的最快的方法。或者,您可以使用 sub/gsub 去除您不想留下的内容。
在正则表达式中使用捕获括号,在替换中使用组引用。括号中的任何内容都会被记住。然后由第一项\ 2访问它们。第一个反斜杠转义了R中反斜杠的解释,以便将其传递给正则表达式解析器。
gsub('([[:alpha:]]+)([0-9]+)([[:alpha:]]+)', '\\2', "aaa12xxx")
Run Code Online (Sandbox Code Playgroud)