16

今日、talkstats.comで、投稿者が正規表現 ( ではなく) を使用して文字列の最後のピリオドを削除したいという質問がありましたstrsplit。私はこれを試みましたが、失敗しました。

N <- c("59.22.07", "58.01.32", "57.26.49")

#my attempts:
gsub("(!?\\.)", "", N)
gsub("([\\.]?!)", "", N)

文字列の最後のピリオドを削除して取得するにはどうすればよいですか。

[1] "59.2207" "58.0132" "57.2649"
4

4 に答える 4

24

たぶん、これはもう少し読みやすいです:

gsub("(.*)\\.(.*)", "\\1\\2", N)
[1] "59.2207" "58.0132" "57.2649"

貪欲なので、最初(.*)は最後まですべてを一致させ、.に格納し\\1ます。2 番目(.*)は、最後以降のすべてに一致し、.に格納され\\2ます。

\\.を選択した任意の文字に置き換えて、その文字の最後の出現を削除できるという意味で、これは一般的な答えです。交換するのは1回だけです!

あなたもできる:

gsub("(.*)\\.", "\\1", N)
于 2013-01-25T20:15:16.523 に答える
14

この正規表現が必要です:-

[.](?=[^.]*$)

そして、それを空の文字列に置き換えます。

したがって、次のようになります。-

gsub("[.](?=[^.]*$)","",N,perl = TRUE)

説明: -

[.]         // Match a dot
(?=         // Followed by
    [^.]    // Any character that is not a dot.
     *      // with 0 or more repetition
     $      // Till the end. So, there should not be any dot after the dot we match.
)  

したがって、dot(.)先読みでaが一致するとすぐに、一致は失敗します。これはdot、現在のドットの後ろのどこかにパターンが一致しているためです。

于 2013-01-25T20:03:33.473 に答える
5

パッケージで使用しているので、これはもうわかっているとstringi思いますが、簡単に行うことができます

N <- c("59.22.07", "58.01.32", "57.26.49")

stringi::stri_replace_last_fixed(N, ".", "")
# [1] "59.2207" "58.0132" "57.2649"
于 2015-02-28T23:12:59.133 に答える
2

私は正規表現をかなり怠けていますが、これは機能します:

gsub("(*)(.)([0-9]+$)","\\1\\3",N)

私は標準とは逆のアプローチをとる傾向があります。「。」を置き換える代わりに 長さ 0 の文字列を使用して、どちらかの側にある 2 つの部分を解析するだけです。

于 2013-01-25T20:14:51.327 に答える