【问题标题】:text manipulation in RR中的文本操作
【发布时间】:2016-11-27 23:27:00
【问题描述】:

我正在尝试在某些书名字符串周围添加括号,并且我希望能够使用 paste0 函数进行粘贴。我要取这个字符串:

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”),”)”)

帮助?

【问题讨论】:

  • 规则是什么?找到 4 位数的单词,然后用括号将其包裹在后面的所有单词中?

标签: r regex string replace pattern-matching


【解决方案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 组:一个或多个空格、(、除 ()) 之外的零个或多个字符。

在反向引用的帮助下,组的内容被插入回结果中。

如果单词较多,并且需要在字符串中的 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 位数的整个单词之前的位置(请参阅正向预测 (?=\\b\\d{4}\\b))或上一个成功匹配的结尾
  • \\s* - 0+ 个空格
  • \\K - 省略目前匹配的文本
  • \\b(\\S+) - 第 1 组捕获 1 个或多个前面带有单词边界的非空白符号。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多