2016-11-27 80 views
2

我想在某些書名字符串周圍添加括號,並且希望能夠使用paste0函數粘貼。我想利用這個字符串:R中的文本操作

a <- c("I Like What I Know 1959 02e pdfDrama (amazon.com)", "My Liffe 1993 07e pdfDrama (amazon.com)") 

包的特定字符串括號:

a 
[1] 「I Like What I Know (1959) (02e) (pdfDrama) (amazon.com)」 
[2] 」My Life (1993) (07e) (pdfDrama) (amazon.com)」 

我都試過,但不能想出一個辦法,從字符串替換它們:

paste0("(",str_extract(a, "\\d{4}"),")") 
paste0("(",str_extract(a, 」[0-9]+.e」),」)」) 

幫助?

+1

什麼是規則?找到4位數的單詞並用圓括號包裹所有後續單詞? –

回答

1

我可以建議一個正則表達式固定數量的特定類型的話:

a <- c("I Like What I Know 1959 02e pdfDrama (amazon.com)","My Life 1993 07e pdfDrama (amazon.com)") 
sub("\\b(\\d{4})(\\s+)(\\d+e)(\\s+)([a-zA-Z]+)(\\s+\\([^()]*\\))", "(\\1)\\2(\\3)\\4(\\5)\\6", a) 

R demo

這裏是regex demo。總之,

  • \\b(\\d{4}) - 捕捉4位作爲一個整體字成組1
  • (\\s+) - 組2:一個或多個空格
  • (\\d+e) - 第3組:一個或多個數字和e
  • (\\s+) - 組4:同上
  • ([a-zA-Z]+) - 第5組:一個或多個字母
  • (\\s+\\([^()]*\\)) - 組6:一種或更多空格,(,0或更多字符,而不是(),)

在反向引用的幫助下,組的內容被插回到結果中。

如果有更多的話,你需要包裝開始以字母/數字字/字符串中的4位數字後強調,使用

gsub("(?:(?=\\b\\d{4}\\b)|\\G(?!\\A))\\s*\\K\\b(\\S+)", "(\\1)", a, perl=TRUE) 

R demoregex demo

詳細

  • (?:(?=\\b\\d{4}\\b)|\\G(?!\\A)) - 無論是一個4位數字的整體窩前的位置d(見正先行(?=\\b\\d{4}\\b))或先前成功匹配的端
  • \\s* - 0+空格
  • \\K - 省略文本匹配到目前爲止
  • \\b(\\S+) - 第1組捕捉1個或多個非空白符號前面有一個單詞邊界。