提取正则表达式匹配

tov*_*are 97 regex r

我正在尝试从字符串中提取数字.

并做一些类似于[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)

  • (几乎)完全满足了我的需求,但是当我开始输入`?str_extract`时,我看到了`str_extract_all`,生活又恢复了。 (3认同)

the*_*ail 78

说" 忽略标准函数 " 可能有点仓促- ?gsub甚至在"另请参见"中特别引用的帮助文件:

'regmatches'用于根据'regexpr','gregexpr'和'regexec'的结果提取匹配的子串.

所以这会起作用,而且相当简单:

txt <- "aaa12xxx"
regmatches(txt,regexpr("[0-9]+",txt))
#[1] "12"
Run Code Online (Sandbox Code Playgroud)

  • @DuccioA - `regmatches(x, gregexpr("[0-9]+", x))` - 就像 `sub` 用于一个替换,`gsub` 用于所有替换,`regexpr` 找到一个结果,而`gregexpr` 查找所有结果。 (4认同)
  • 如何提取多个组?例如,从字符串“aaa12bbb15ccc”中分别提取12和15? (2认同)

Mar*_*rek 24

也许

gsub("[^0-9]", "", "aaa12xxxx")
# [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)

在这种情况下,尝试替换非数字会导致错误.

  • 如果你愿意使用稍微丑陋的"[^ 0-9]*([0-9] +),则不需要PERL.*" (3认同)

Rob*_*ert 5

一种方法是这样的:

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 去除您不想留下的内容。


Rag*_*aac 5

在正则表达式中使用捕获括号,在替换中使用组引用。括号中的任何内容都会被记住。然后由第一项\ 2访问它们。第一个反斜杠转义了R中反斜杠的解释,以便将其传递给正则表达式解析器。

gsub('([[:alpha:]]+)([0-9]+)([[:alpha:]]+)', '\\2', "aaa12xxx")
Run Code Online (Sandbox Code Playgroud)