【问题标题】:R: read in quotes from .txt without backslashR:从 .txt 中读取引号,不带反斜杠
【发布时间】:2015-06-02 06:37:54
【问题描述】:

我将字符串 (?<=k)(",V,")(?=p) 保存在 .txt file 的表中——为了简单起见,假设它在第 1 行第 1 列中。我使用 read.table 和 @987654325 在 file 中读取@。我想使用paste0(file[1,1]) 来返回字符串"(?<=k)(",V,")(?=p)"。但相反,R 一直给我"(?<=k)(\",V,\")(?=p)",在最初来自file 的两个引号之前有一个反斜杠。我该怎么做才能阅读 .txt literally 中的引号?谢谢!

更新:

我在file 中将字符串更改为"(?<=k)(",V,")(?=p)",使用4 个而不是2 个原始引号。读完后,我按照MichaelVE的建议使用了cat()

cat(paste0(file[1,1]))

这确实给了我想要的顺序:

"(?<=k)(",V,")(?=p)"

但我不能在像gsub 这样的另一个函数中使用输出,因为它不是字符串——事实上我不知道它是什么。关于如何将其转换为可用的东西的任何想法?

【问题讨论】:

    标签: regex r escaping quotes backslash


    【解决方案1】:

    这只是 R “读取”字符串中引号的一种方式。

    我相信使用 cat(x) 可以解决 x 是您的字符串的问题。这会将您的字符串格式化为“最终用户”格式。

    【讨论】:

    • cat() 返回NULL,所以如果你分配它就会丢失输出
    • 这不会发生在我身上。 cat("(?
    • 试试x <- cat("(?<=k)(\",V,\")(?=p)"); x
    • 我明白你的意思,cat() 确实仅用于输出,而不是将其保存为新字符串。如果它是一个新字符串,您最终会得到输入,因为 R 会将其转换回不可打印的字符
    【解决方案2】:

    \"?Quotes 中描述的“不可打印”字符之一。

    ...反斜杠用于转义字符常量中的以下字符

    反斜杠用于在字符常量中启动转义序列。

    单引号在单引号字符串中需要反斜杠转义,在双引号字符串中需要双引号

    某些字符在字符常量中时需要以转义序列开头。

    例如,尝试用嵌入的双引号为其赋值,你会得到一个错误

    x <- "(?<=k)(",V,")(?=p)"
    # Error: unexpected ',' in "x <- "(?<=k)(","
    

    所以我们既可以用单引号引用它,也可以转义嵌入的引号。

    x <- '(?<=k)(",V,")(?=p)'
    x
    # [1] "(?<=k)(\",V,\")(?=p)"
    

    现在对于“可用”和可分配的输出,最好使用print(),因为cat() 返回NULL。但请注意,逃逸仍然存在,您无法摆脱它们。

    p <- print(x, quote=FALSE)
    # [1] (?<=k)(",V,")(?=p)
    p
    # [1] "(?<=k)(\",V,\")(?=p)"
    

    【讨论】:

    • 啊,我明白了。我希望"(?&lt;=k)(",V,")(?=p)" 可以从 .txt b/c 中工作,如果我在 R 控制台中输入它:V &lt;- '[aeiou]'paste0("(?&lt;=l)(",V,")(?=st)")&gt; [1] "(?&lt;=l)([aeiou])(?=st)" 输出可以反过来用于匹配除最后一个单词之外的所有内容: lVst &lt;- c('last','lest','list','lost','lust','lyst') grep(paste0("(?&lt;=l)(",V,")(?=st)"),lVst,perl=T) [1] 1 2 3 4 5 这对我来说基本上是一种有点尴尬的方式来自定义一个 char 类而不必输入字符(b/c R 不允许自定义正则表达式)。如果我可以将它保存在 .txt 中,它会看起来更好。哦,好吧...
    【解决方案3】:

    检查 ?read.table 中的 'quote' 参数。

    报价
    引用字符集。要完全禁用引用,请使用quote = ""。请参阅 scan 以了解引号中嵌入的引号的行为。引用仅适用于读取为字符的列,除非指定 colClasses,否则所有列都是。

    编辑:

    df <- read.table("myfile.txt", 
                     header = TRUE,
                     sep = "\t", 
                     stringsAsFactors = FALSE,
                     quote = "")
    df[1,1]
    [1] "(?<=k)(\",V,\")(?=p)"  
    
    df <- read.table("myfile.txt", 
                     header = TRUE,
                     sep = "\t", 
                     stringsAsFactors = FALSE,
                     quote = "\"")
    
    df[1,1]
    [1] "(?<=k)(,V,)(?=p)"
    

    编辑2

    df <- read.table("myfile.txt", 
                     header = TRUE,
                     sep = "\t", 
                     stringsAsFactors = FALSE,
                     quote = "\"")
    
    dput(df)
    structure(list(Filename = c("(?<=k)(,V,)(?=p)", "(?<=k)(,V,)(?=p)", 
    "(?<=k)(,V,)(?=p)", "(?<=k)(,V,)(?=p)", "(?<=k)(,V,)(?=p)", "(?<=k)(,V,)(?=p)"
    )), .Names = "Filename", class = "data.frame", row.names = c(NA, 
    -6L))
    
    str(df)
    'data.frame':   6 obs. of  1 variable:
     $ Filename: chr  "(?<=k)(,V,)(?=p)" "(?<=k)(,V,)(?=p)" "(?<=k)(,V,)(?=p)" "(?<=k)(,V,)(?=p)" ...
    
    df[1,1]
    [1] "(?<=k)(,V,)(?=p)"
    
    str(df[1,1])
     chr "(?<=k)(,V,)(?=p)"
    
    gsub("[(\")]", '', df[1,1])
    
    [1] "?<=k,V,?=p"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-24
      • 2022-11-28
      • 1970-01-01
      • 1970-01-01
      • 2014-06-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多