【问题标题】:how to use gsub to remove a complex pattern如何使用 gsub 删除复杂的模式
【发布时间】:2017-04-09 20:52:34
【问题描述】:

我正在尝试使用 gsub() 来清理 csv 格式的文本数据集。现在我的数据示例行如下:

"5.0\t/gp/customer-reviews/R3M62HO4M6LXE6?ASIN=0439023521\tEngaging. Brutal but engaging!\t\"Wow.  I was barely able to put this book down for a second after the first few pages got me completely hooked. 

我想删除没有提供任何内容的开始字符串并删除所有 \t\ 或 \t 以获得预期的结果,如

"Engaging.  Brutal but engaging!"Wow.  I was barely able to put this book down for a second after the first few pages got me completely hooked. 

我尝试使用

gsub('\\t\\', "", comment, fix=TRUE)

删除 \t\ 但它没有工作。 而且开头的字符串太复杂了,我在编写正确的模式表达式时遇到了麻烦。

【问题讨论】:

  • “什么都不提供”?这是什么意思?
  • @WiktorStribiżew 这意味着非标准英文字符串确实包含我想要的任何信息..
  • 但是customer-reviews 在我看来很标准

标签: r regex gsub data-cleaning


【解决方案1】:

我们可以试试

gsub(".*\\d+\t|\t", "", comment)

【讨论】:

  • 你认为输入字符串中不会有任何“非空”数字吗?
  • @WiktorStribiżew 我不确定 OP 是否想要匹配一般模式
  • @PatrickD:如果“有意义”的非最后一列以数字结尾(例如,以年份或某些产品等 ID),则会删除太多。
【解决方案2】:

如果您想使用stringr 库:

library(stringr)
str_replace(val,".*\\t(?=[:alnum:])","")

使用 gsub

gsub(".*\\t(?=[a-zA-Z0-9])", "", val,perl=T) 

gsub(".*\\t(?=[[:alnum:]])", "", val,perl=T)

输出

 > str_replace(val,".*\\t(?=[:alnum:])","")
[1] "Engaging. Brutal but engaging!\t\"Wow.  I was barely able to put this book down for a second after the first few pages got me completely hooked."

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-31
    • 2016-02-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-26
    • 2016-12-14
    • 1970-01-01
    相关资源
    最近更新 更多