1

我有一堆混合长度的字符串,但都嵌入了一年。我正在尝试仅提取文本部分,即数字开始之前的所有内容,并且假设这是此类提取的正确方法,并且在前瞻断言方面遇到问题。

这是我所拥有的(返回不匹配):

>grep("\\b.(?=\\d{4})","foo_1234_bar",perl=T,value=T)

在示例中,我只是希望提取,foo但可能有几个混合长度,_在年份部分之前分开。

4

3 回答 3

5

在这里,前瞻可能有点矫枉过正。使用下划线和 4 位数字作为结构,结合非贪婪量词以防止“点”吞噬所有内容:

/(.+?)_\d{4}/ 

-第一个匹配组 ($1) 持有 'foo'

于 2012-09-17T02:52:04.757 回答
4

这将抓取所有内容,直到第一个数字

x <- c("asdfas_1987asdf", "asd_das_12")
regmatches(x, regexpr("^[^[:digit:]]*", x))
#[1] "asdfas_"  "asd_das_"
于 2012-09-17T02:39:44.590 回答
2

另一种方法(我经常发现 strsplit 比正则表达式搜索更快,但并非总是如此(尽管这确实使用了一点正则表达式):

x <- c("asdfas_1987asdf", "asd_das_12") #shamelessly stealing Dason's example
sapply(strsplit(x, "[0-9]+"), "[[", 1)
于 2012-09-17T02:54:02.270 回答