我有一堆混合长度的字符串,但都嵌入了一年。我试图只提取文本部分,即所有内容,直到数字开始,并且我对lookeahead断言有问题,假设这是这种提取的正确方法。
这是我所拥有的(返回不匹配):
>grep("\\b.(?=\\d{4})","foo_1234_bar",perl=T,value=T)
在示例中,我希望仅提取foo
,但可能有几个,并且混合长度在年份之前由_
分隔。
答案 0 :(得分:5)
在这里预测可能有点过头了。使用下划线和4位数字作为结构,结合非贪婪的量词,以防止'点'吞噬一切:
/(.+?)_\d{4}/
- 第一个匹配组($ 1)持有'foo'
答案 1 :(得分:3)
这将抓住所有内容,直到第一个数字
x <- c("asdfas_1987asdf", "asd_das_12")
regmatches(x, regexpr("^[^[:digit:]]*", x))
#[1] "asdfas_" "asd_das_"
答案 2 :(得分:2)
另一种方法(通常我发现strsplit比正则表达式搜索更快但并不总是(虽然这确实使用了一点点的再生):
x <- c("asdfas_1987asdf", "asd_das_12") #shamelessly stealing Dason's example
sapply(strsplit(x, "[0-9]+"), "[[", 1)