用引号替换空格

时间:2018-07-30 01:22:46

标签: r regex

我正在R中工作。我正在尝试导入数据,有些使用制表符,有些使用列之间的空白。我的代码如下:

gsub("[[:blank:]]", ";", 
readLines(paste(PathToRecipes,recipe.files[i],sep="/")))

我阅读了每个文件的行,然后gsub用冒号替换所有空白。然后,将其放入write.table中,并具有一组新文件,可以将其重新导入到数据框中。

问题是我得到了:

"1";6;"medium;(2-1/4\";to;3-1/4\";dia.)";"Potatoes,;boiled,;cooked;without;skin,;flesh,;without;salt";11367

我什么时候应该得到:

"1";6;"medium (2-1/4\" to 3-1/4\" dia.)";"Potatoes, boiled, cooked without skin, flesh, without salt";11367

在引号中有一些文本,其中的空格不应替换为“;”。我该如何避免使用引号?

2 个答案:

答案 0 :(得分:0)

如果您不想用分号替换的文本中的空格不是“制表符”,那么您应该能够执行当前操作,而不必使用[[:blank:]],而是使用{{1} }仅替换制表符而不是所有空格。

\\t

答案 1 :(得分:0)

您可以将PCRE regex与SKIP-FAIL技术结合使用:

(*UCP)"[^"\\]*(?:\\.[^"\\]*)*"(*SKIP)(*F)|\s+

请参见regex demo。您的数据似乎只包含成对的双引号,因此上述模式就足够了。否则,再增加一点:

(*UCP)(?<!\\)(?:\\{2})*"[^"\\]*(?:\\.[^"\\]*)*"(*SKIP)(*F)|\s+

详细信息

  • (*UCP)-使\s可以识别Unicode
  • (?<!\\)-当前位置左侧不允许\
  • (?:\\{2})*-0个以上的双反斜杠序列
  • "-一个"字符
  • [^"\\]*-除"\以外的零个或多个字符
  • (?:\\.[^"\\]*)*-任何转义序列的零个或多个序列,然后是"\以外的零个或多个字符
  • "-一个"字符
  • (*SKIP)(*F)-忽略并跳过当前匹配项,以从当前索引中查找下一个匹配项(跳过的匹配项在此结束)
  • |-或
  • \s+-在任何其他上下文中匹配1个或多个空格。

R demo

rx <- '(*UCP)(?<!\\\\)(?:\\\\{2})*"[^"\\\\]*(?:\\\\.[^"\\\\]*)*"(*SKIP)(*F)|\\s+'
x <- c('"1"; 6; "medium (2-1/4\\" to 3-1/4\\" dia.)"; "Potatoes, boiled, cooked without skin, flesh, without salt"; 11367')
cat(gsub(rx, '', x, perl=TRUE))
## => "1";6;"medium (2-1/4\" to 3-1/4\" dia.)";"Potatoes, boiled, cooked without skin, flesh, without salt";11367