9

HTML テーブルから抽出したリストをフラットにしたいと考えています。最小限の作業例を以下に示します。stringrこの例は、R のパッケージに依存します。最初の例は、望ましい動作を示しています。

years <- c("2005-", "2003-")
unlist(str_extract_all(years,"[[:digit:]]{4}"))

[1] "2005" "2003"

次の例では、最後の 4 桁の数字を一連の他の数字と照合しようとすると、望ましくない結果が生成されます。

years1 <- c("2005-", "2003-", "1984-1992, 1996-")
unlist(str_extract_all(years1,"[[:digit:]]{4}$"))

character(0)

$ドキュメントを理解しているので、文字列の最後で一致を要求するには、パターンの最後に含める必要があります。2 番目の例から、"2005"、"2003"、"1996" の数字を一致させたいと思います。

4

4 に答える 4

14

これにはベース Rsubを非常に簡単に使用できます。

sub('.*(\\d{4}).*', '\\1', years1)

## [1] "2005" "2003" "1996"

ここで一致するパターンは、.*(0 個以上の任意の文字) の後に\\d{4}(4 つの連続した数字。括弧で囲むことによって取得します)、その後に 0 個以上の文字が続きます。

sub一致したパターンを 2 番目の引数の値に置き換えます。この場合、\\1は、一致したパターン全体を最初にキャプチャされた部分文字列 (つまり、連続する 4 つの数字) に置き換えることを示します。

ここでの正規表現は貪欲であるため、 の初期の一致をバイパスし\\d{4}、 でそれらを消費します.*。4 つの連続する数字の最後のシーケンスのみがキャプチャされます。

于 2015-02-20T05:33:04.863 に答える
11

このstringiパッケージには、文字列の特定の部分を操作する便利な関数があります。したがって、次のようにして、連続する 4 桁の最後の出現を見つけることができます。

library(stringi)

x <- c("2005-", "2003-", "1984-1992, 1996-")

stri_extract_last_regex(x, "\\d{4}")
# [1] "2005" "2003" "1996"

同じ結果を得る他の方法は次のとおりです。

stri_sub(x, stri_locate_last_regex(x, "\\d{4}"))
# [1] "2005" "2003" "1996"

## or, since these count as words
stri_extract_last_words(x)
# [1] "2005" "2003" "1996"

## or if you prefer a matrix result
stri_match_last_regex(x, "\\d{4}")
#      [,1]  
# [1,] "2005"
# [2,] "2003"
# [3,] "1996"
于 2015-02-20T05:30:09.200 に答える
1
\\d{4}[^\\d]*$

これを試してみてください。これでうまくいくはずです。デモをご覧ください。

https://regex101.com/r/kG5pN6/2

于 2015-02-20T05:29:22.337 に答える