我匹配并替换前面和后面跟着空格的4位数字:
str12 <- "coihr 1234 &/()= jngm 34 ljd"
sub("\\s\\d{4}\\s", "", str12)
[1] "coihr&/()= jngm 34 ljd"
但是,每次尝试反转它并提取数字都会失败。 我想要:
[1] 1234
有人有线索吗?
ps:我知道怎么用{stringr}来做,但我想知道是否只能使用{base} ..
require(stringr)
gsub("\\s", "", str_extract(str12, "\\s\\d{4}\\s"))
[1] "1234"
答案 0 :(得分:6)
regmatches()
仅在R-2.14.0之后可用,允许您“从regexpr
,gregexpr
或regexec
获得的匹配数据中提取或替换匹配的子字符串”
以下示例说明如何使用regmatches()
在输入字符串中提取第一个空白缓冲的4位数子字符串,或者 all 这样的子串。
## Example strings and pattern
x <- "coihr 1234 &/()= jngm 34 ljd" # string with 1 matching substring
xx <- "coihr 1234 &/()= jngm 3444 6789 ljd" # string with >1 matching substring
pat <- "(?<=\\s)(\\d{4})(?=\\s)"
## Use regexpr() to extract *1st* matching substring
as.numeric(regmatches(x, regexpr(pat, x, perl=TRUE)))
# [1] 1234
as.numeric(regmatches(xx, regexpr(pat, xx, perl=TRUE)))
# [1] 1234
## Use gregexpr() to extract *all* matching substrings
as.numeric(regmatches(xx, gregexpr(pat, xx, perl=TRUE))[[1]])
# [1] 1234 3444 6789
(请注意,对于不包含符合条件的子字符串的字符串,这将返回numeric(0)
。
答案 1 :(得分:4)
可以使用()
在正则表达式中捕获组。采用相同的例子
str12 <- "coihr 1234 &/()= jngm 34 ljd"
gsub(".*\\s(\\d{4})\\s.*", "\\1", str12)
[1] "1234"
答案 2 :(得分:0)
一般来说,我对正则表达式很天真,但这是在基地做一个丑陋的方式:
# if it's always in the same spot as in your example
unlist(strsplit(str12, split = " "))[2]
# or if it can occur in various places
str13 <- unlist(strsplit(str12, split = " "))
str13[!is.na(as.integer(str13)) & nchar(str13) == 4] # issues warning