R中的清洁字符串:添加标点符号,不覆盖最后一个字符

时间:2014-08-22 22:17:21

标签: regex r gsub

我是R的新手,无法找到类似问题的其他主题。

我正在清理每行末尾需要标点符号的数据。我无法添加一段时间而不会覆盖回车+换行前面的行的最后一个字符。

示例代码:

Data1 <- "%trn: dads sheep\r\n*MOT: hunn.\r\n%trn: yes.\r\n*MOT: ana mu\r\n%trn: where is it?"
Data2 <- gsub("[^[:punct:]]\r\n\\*", ".\r\n\\*", Data1)

Data2的内容:

[1] "%trn: dads shee.\r\n*MOT: hunn.\r\n%trn: yes.\r\n*MOT: ana mu\r\n%trn: where is it?"

注意羊的“p”被周期覆盖。有关如何避免这种情况的任何想法?

2 个答案:

答案 0 :(得分:2)

捕获组:

在角色类周围使用capturing group并引用替换内的群组。

gsub('([^[:punct:]])\\r\\n\\*', '\\1.\r\n*', Data1)
      ^            ^             ^^^
# [1] "%trn: dads sheep.\r\n*MOT: hunn.\r\n%trn: yes.\r\n*MOT: ana mu\r\n%trn: where is it?"

Lookarounds:

您可以使用perl=T启用PCRE并使用外观来实现此目的。

gsub('[^\\pP]\\K(?=\\r\\n\\*)', '.', Data1, perl=T)
# [1] "%trn: dads sheep.\r\n*MOT: hunn.\r\n%trn: yes.\r\n*MOT: ana mu\r\n%trn: where is it?"

否定 Unicode property \pP类匹配除任何标点符号之外的任何字符。

我没有使用捕获组,而是使用了\K。此转义序列重置报告的匹配的起始点。 任何以前匹配的字符都不包含在最终匹配的序列中。同样,我使用Positive Lookahead来断言回车符,换行符序列和文字星号字符。

答案 1 :(得分:1)

有几种方法可以做到:

捕获组: gsub("([^[:punct:]])\\r\\n\\*", "\\1.\r\n*", Data1)

正面观察(非捕获组): gsub("(?<=[^[:punct:]])\\r\\n\\*", ".\r\n*", Data1, perl=T)

编辑:修复了反斜杠并消除了对R支持的不确定性。