2017-05-09 14 views
3

Rでデータフレーム文字列置換をしようとしています。@(スペースなし、例えば@word)で始まるすべての単語を探し、 '@ ' ために '!' (例えば、@wordから!wordへ)。同時に、それは '@'の他のインスタンスをそのまま残す(例えば、@または@@または@ [@])。たとえば、これは私のオリジナルデータフレーム(:@def、@jkl、@stu変更する):ある先頭に@を付けずに同じ単語を置き換えてください。

> df = data.frame(number = 1:4, text = c('abc @def ghi', '@jkl @ mno', '@[@] pqr @stu', 'vwx @@@ yz')) 
> df 
    number   text 
1  1 abc @def ghi 
2  2 @jkl @ mno 
3  3 @[@] pqr @stu 
4  4 vwx @@@ yz 

そして、これは私が見えるように、それを必要とするものである:

> df_result = data.frame(number = 1:4, text = c('abc !def ghi', '!jkl @ mno', '@[@] pqr !stu', 'vwx @@@ yz')) 
> df_result 
    number   text 
1  1 abc !def ghi 
2  2 !jkl @ mno 
3  3 @[@] pqr !stu 
4  4 vwx @@@ yz 

私が試してみました

> gsub('@.+[a-z] ', '!', df$text) 
[1] "abc !ghi" "[email protected] mno"  "[email protected]"  "vwx @@@ yz" 

を持つ。しかし、結果は、望ましいものではありません。どんな助けも大歓迎です。

ありがとうございます。およそ

gsub("(^|)@(\\w)", "\\1!\\2", df$text) 
# [1] "abc !def ghi" "!jkl @ mno" "@[@] pqr !stu" "vwx @@@ yz" 

これは、文字列の先頭に@シンボルと一致する、またはスペースの後にどのように

答えて

3

。次に、@シンボルの後に文字をキャプチャし、@!に置き換えます。 regex101.com

説明礼儀:

  • (^|)は、第一キャプチャグループです。 ^は文字列の先頭に位置をアサートします。 |は「or」を示します。空白はスペース文字文字通り文字通り
  • @一致する文字@(大文字と小文字を区別)
  • (\\w)は、それが置換文字列\\1!\\2は、正規表現マッチを置き換える単語文字

を示し、第二キャプチャグループで一致しました(\\1)、続いて!、続いて第2の捕捉基(\\2)を用いて測定した。

+0

こんにちはリッチスクリィン、その背後にあるロジックの解説と非常に詳細な説明に感謝します。それは完全に動作します。すてきな一日を。 – user3550647

3

あなたは "Rで使用される正規表現" から(?=...)

gsub("@(?=[A-Za-z])", "!", df$text, perl = TRUE) 
[1] "abc !def ghi" "!jkl @ mno" "@[@] pqr !stu" "vwx @@@ yz" 

ドキュメントページ肯定先読みを使用することができます。

パターン(?= ...)をして(?!。 ..)は、ゼロ幅の正と負の先読みアサーションです。現在の位置からの前方一致を試みると成功するかどうかは一致しますが、処理中の文字列には文字は使用されません。

+0

こんにちはSraffa、あなたの答えと説明に非常に感謝します。あなたのソリューションは完璧に動作します。良い一日を過ごしてください。 – user3550647

関連する問題