2017-05-09 85 views
3

我想在R中做一個數據幀字符串替換。我需要找到所有以'@'開頭的單詞(沒有空格,例如@word)並且改變'@ '爲'!' (例如從@word到!字)。同時,它會保留「@」的其他實例(例如@或@@或@ [@])。例如,這是我原來的數據框(改:@def,@jkl,@stu):在R中用相同的單詞替換沒有初始@的相同單詞

> 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" 

但結果不是理想的。任何幫助深表感謝。

謝謝。

回答

3

如何

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

這在一個字符串開頭的@符號匹配,或空格之後。然後,我們在@符號後捕獲單詞字符,並用!代替@。的regex101.com

說明禮貌:

  • (^|)是第一捕獲組; ^斷言字符串的開始位置; |表示「或」;空白空間相匹配的空格字符字面上
  • @字符@字面上(區分大小寫)
  • (\\w)是第二捕獲組相匹配時,它表示一個單詞字符

替換字符串\\1!\\2替換正則表達式匹配與第一捕獲組(\\1),其次是!,其次是第二捕獲組(\\2)。

+0

嗨Rich Scriven,非常感謝你的解決方案和背後的邏輯非常詳細的解釋。它完美的作品。祝你有美好的一天。 – user3550647

3

您可以使用正向前查找(?=...)

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

從文檔頁面 「正則表達式與R使用」:

模式(?= ...)和(?!。 ..)是零寬度的正面和負面的前瞻斷言:如果嘗試匹配...從當前位置向前成功(或不)​​,但在正在處理的字符串中不使用字符。

+0

嗨Sraffa,非常感謝你的回答和解釋。您的解決方案完美運作祝你有美好的一天。 – user3550647

相關問題