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