11

Rの正規表現で奇妙なリクエストがあります。複数の末尾ピリオドを持つ文字列のベクトルがあります。これらのピリオドをスペースに置き換えたいと思います。例と望ましい結果は、私が何を求めているのかを明確にする必要があります(おそらく、のパターン引数ではなく、引数を置き換えるために与えるもので攻撃する必要がありますgsub):

例と試み:

x <- c("good", "little.bad", "really.ugly......")
gsub("\\.$", " ", x)
  #produces this
  #[1] "good"              "little.bad"        "really.ugly..... "
gsub("\\.+$", " ", x)
  #produces this
  #[1] "good"         "little.bad"   "really.ugly "

望ましい結果

[1] "good"              "little.bad"        "really.ugly      "

したがって、元のベクトル(x)の最後の文字列の最後に6つのピリオドがあるので、実際と醜い間のピリオドに触れずに6つのスペースが必要です。$私は最後のルックスを知っていますが、これを乗り越えることはできません。

4

3 に答える 3

17

これを試して:

gsub("\\.(?=\\.*$)", " ", mystring, perl=TRUE)

説明:

\.   # Match a dot
(?=  # only if followed by
 \.* # zero or more dots
 $   # until the end of the string
)    # End of lookahead assertion.
于 2012-08-31T21:33:25.777 に答える
2

意味のある正規表現の解決策を待っている間に、これを解決するための無意味な方法を考え出すことにしました。

messy.sol <- function(x) {
paste(unlist(list(gsub("\\.+$", "", x), 
    rep(" ", nchar(x) -  nchar(gsub("\\.+$", "", x))))),collapse="")
}

sapply(x, messy.sol, USE.NAMES = FALSE)

ティムは少しきれいだと思います:)

于 2012-08-31T21:41:44.837 に答える
2

ティムの解決策は明らかに優れていますが、私は別の方法で自分の手を試してみると思いました。の自由な使用を使用すると、regmatchesここで私たちを助けます

x <- c("good", "little.bad", "really.ugly......")
# Get an object with 'match data' to feed into regmatches
# Here we match on any number of periods at the end of a string
out <- regexpr("\\.*$", x)

# On the right hand side we extract the pieces of the strings
# that match our pattern with regmatches and then replace
# all the periods with spaces.  Then we use assignment
# to store that into the spots in our strings that match the
# regular expression.
regmatches(x, out) <- gsub("\\.", " ", regmatches(x, out))
x
#[1] "good"              "little.bad"        "really.ugly      "

したがって、単一の正規表現ほどクリーンではありません。しかし、私は、perlの正規表現でそれらの先読みを学ぶことに実際に慣れたことはありません。

于 2012-08-31T22:04:23.283 に答える