我是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”被周期覆盖。有关如何避免这种情况的任何想法?
答案 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?"
您可以使用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支持的不确定性。