1

さまざまな長さの文字列がたくさんありますが、すべて1年が埋め込まれています。私はテキスト部分だけを抽出しようとしています。それは番号が始まるまでのすべてであり、それがそのような抽出の適切な方法であると仮定して、lookeaheadアサーションに問題があります。

これが私が持っているものです(一致しないものを返します):

>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 に答える