2016-11-27 54 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个或多个非空白符号前面有一个单词边界。