我正在平衡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)
答案 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 还有regmatches
和regexec
,但这已在另一个答案中介绍过了。
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
选择所需的输入。可以使用strsplit
,read.table
或scan
:
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"