如何用基础R做str_extract?

时间:2017-12-06 16:10:03

标签: r regex

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

我正在阅读此页面,看看与stringr::str_extract相当的基本R是什么:

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)

3 个答案:

答案 0 :(得分:11)

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

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

2)regexec / regmatches 还有regmatchesregexec,但这已在另一个答案中介绍过了。

3)sub 此外,通常可以使用sub

sub(".* ([0-9.]+).*", "\\1", x)
## [1] "1.2.3"

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

sub(".* ", "", x)
## [1] "1.2.3"

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

gsub("[^0-9.]", "", x)
## [1] "1.2.3"

5)read.table 通常可以将输入分解为字段,然后按编号或grep选择所需的输入。可以使用strsplitread.tablescan

read.table(text = x, as.is = TRUE)[[2]]
## [1] "1.2.3"

5a)grep / scan

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

5b)grep / strsplit

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

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

substring(x, 9)
## [1] "1.2.3"

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

substring(x, regexpr("\\d", x))
## [1] "1.2.3"

7)read.dcf 有时可以将输入转换为dcf格式,在这种情况下可以使用read.dcf读取。此类数据的格式为name: value

 read.dcf(textConnection(sub(" ", ": ", x)))
 ##      release
 ## [1,] "1.2.3"

答案 1 :(得分:2)

你可以做到

txt <- c("foo release 123", "bar release", "foo release 123 bar release 123")
pattern <- "release ([0-9]+)"
stringr::str_extract(txt, pattern)
# [1] "release 123" NA            "release 123"
sapply(regmatches(txt, regexec(pattern, txt)), "[", 1)
# [1] "release 123" NA            "release 123"

答案 2 :(得分:1)

ReactDOM.render

提取第一场比赛

txt <- c("foo release 123", "bar release", "foo release 123 bar release 123")
pattern <- "release ([0-9]+)"

提取所有匹配

sapply(
    X = txt,
    FUN = function(x){
        tmp = regexpr(pattern, x)
        m = attr(tmp, "match.length")
        st = unlist(tmp)
        if (st == -1){NA}else{substr(x, start = st, stop = st + m - 1)}
    },
    USE.NAMES = FALSE)
#[1] "release 123" NA            "release 123"