如何用基础R做str_extract?

wdk*_*nls 8 regex r

我正在平衡R的几个版本,并希望根据哪个R和我正在使用的操作系统来更改我的R库.因此,我想坚持使用基本R功能.

我正在阅读此页面以查看基本R的等价stringr::str_extract物:

http://stat545.com/block022_regular-expression.html

它建议我可以复制这个功能grep.但是,grep如果匹配,我还没有做更多的事情而不是返回整个字符串.这可能是grep单独的,还是我需要将它与另一个功能结合起来?在我的情况下,我试图区分CentOS版本6和7.

grep(pattern = "release ([0-9]+)", x = readLines("/etc/system-release"), value = TRUE)
Run Code Online (Sandbox Code Playgroud)

G. *_*eck 13

1)strcapture如果你想从"release 1.2.3"使用base中提取一串数字和点

x <- "release 1.2.3"
strcapture("([0-9.]+)", x, data.frame(version = character(0)))
##   version
## 1   1.2.3
Run Code Online (Sandbox Code Playgroud)

2)regexec/regmatches还有regmatches,regexec但已经在另一个答案中涵盖了.

3)sub通常也可以使用sub:

sub(".* ([0-9.]+).*", "\\1", x)
## [1] "1.2.3"
Run Code Online (Sandbox Code Playgroud)

3a)如果您知道比赛在开头或结尾,则删除之后或之前的所有内容:

sub(".* ", "", x)
## [1] "1.2.3"
Run Code Online (Sandbox Code Playgroud)

4)gsub有时我们知道要提取的字段具有某些字符,并且它们不会出现在其他地方.在这种情况下,只需删除不能在字符串中的每个字符的每个匹配项:

gsub("[^0-9.]", "", x)
## [1] "1.2.3"
Run Code Online (Sandbox Code Playgroud)

5)read.table通常可以将输入分解为字段,然后通过数字或通过选择所需的输入grep. strsplit,read.tablescan可以使用:

read.table(text = x, as.is = TRUE)[[2]]
## [1] "1.2.3"
Run Code Online (Sandbox Code Playgroud)

5a)grep/scan

grep("^[0-9.]+$", scan(textConnection(x), what = "", quiet = TRUE), value = TRUE)
## [1] "1.2.3"
Run Code Online (Sandbox Code Playgroud)

5b)grep/strsplit

grep("^[0-9.]+$", strsplit(x, " ")[[1]], value = TRUE)
## [1] "1.2.3"
Run Code Online (Sandbox Code Playgroud)

6)substring如果我们知道字段的字符位置,我们可以substring像这样使用:

substring(x, 9)
## [1] "1.2.3"
Run Code Online (Sandbox Code Playgroud)

6a)substring/regexpr或者我们可以用来regexpr为我们找到角色位置:

substring(x, regexpr("\\d", x))
## [1] "1.2.3"
Run Code Online (Sandbox Code Playgroud)

7)read.dcf有时可以将输入转换为dcf形式,在这种情况下可以读取read.dcf.这些数据属于这种形式name: value

 read.dcf(textConnection(sub(" ", ": ", x)))
 ##      release
 ## [1,] "1.2.3"
Run Code Online (Sandbox Code Playgroud)