9

前後に空白が続く 4 桁の数字を照合して、次のように置き換えます。

str12 <- "coihr 1234 &/()= jngm 34 ljd"
sub("\\s\\d{4}\\s", "", str12)
[1] "coihr&/()= jngm 34 ljd"

ただし、これを逆にして数値を抽出しようとするたびに失敗します。私が欲しい:

[1] 1234

誰かが手がかりを持っていますか?

ps: {stringr} でそれを行う方法は知っていますが、{base} のみで可能かどうか疑問に思っています..

require(stringr)
gsub("\\s", "", str_extract(str12, "\\s\\d{4}\\s"))
[1] "1234"
4

3 に答える 3

6

regmatches()、R-2.14.0 以降でのみ利用可能で、 「 regexprgregexprまたはregexec」によって取得された一致データから、一致した部分文字列を抽出または置換できます。

入力文字列の最初の空白でクッションされた 4 桁の部分文字列、またはそのようなすべてregmatches()の部分文字列を抽出するために使用できる方法の例を次に示します。

## Example strings and pattern
x <- "coihr 1234 &/()= jngm 34 ljd"          # string with 1 matching substring
xx <- "coihr 1234 &/()= jngm 3444  6789 ljd" # string with >1 matching substring
pat <- "(?<=\\s)(\\d{4})(?=\\s)"

## Use regexpr() to extract *1st* matching substring
as.numeric(regmatches(x, regexpr(pat, x, perl=TRUE)))
# [1] 1234
as.numeric(regmatches(xx, regexpr(pat, xx, perl=TRUE)))
# [1] 1234


## Use gregexpr() to extract *all* matching substrings
as.numeric(regmatches(xx, gregexpr(pat, xx, perl=TRUE))[[1]])
# [1] 1234 3444 6789

numeric(0)(これは、基準に一致する部分文字列を含まない文字列に対して返されることに注意してください)。

于 2012-08-24T20:55:41.440 に答える
4

を使用して、正規表現でグループをキャプチャすることができ()ます。同じ例を挙げると

str12 <- "coihr 1234 &/()= jngm 34 ljd"
gsub(".*\\s(\\d{4})\\s.*", "\\1", str12)
[1] "1234"
于 2012-08-24T20:35:16.320 に答える
0

私は一般的に正規表現についてかなり素朴ですが、ベースでそれを行う醜い方法は次のとおりです。

# if it's always in the same spot as in your example
unlist(strsplit(str12, split = " "))[2]

# or if it can occur in various places
str13 <- unlist(strsplit(str12, split = " "))
str13[!is.na(as.integer(str13)) & nchar(str13) == 4] # issues warning
于 2012-08-24T19:58:03.997 に答える