用空白替换字符分组后面的字符。

4

我可以帮助您翻译,这段内容涉及编程,主要是处理一个最大宽度为200的文本列的CSV文件。在大多数情况下,数据都很好。但在某些情况下,数据过长或未填写完整,我希望使用正则表达式来查找特定数字/字符配对的最后一个实例,然后删除其后的所有内容。

例如数据:

df <- data.frame(ID = c("1","2","3"),
             text = c("A|explain what a is|12.2|Y|explain Y|2.36|",
                 "A|explain what a is|15.2|E|explain E|10.2|E|explain E but run out hal",
                 "D|explain what d is|0.48|Z|explain z but number 5 is present|"))

我的特定字符对是任何数字后面跟着一个 |

这意味着第一行没问题,第二行将删除“10.2”后面的所有内容,第三行将删除0.48后面的所有内容

我尝试了这个正则表达式:

df[,2] <- sub("([^0-9]+[^|]*$)", "", df[,2])

它几乎成功了,但是我的数据中只有很少的几行在解释中有数字,这些行并不适用。有什么线索吗?我还不是一个很好的正则表达式使用者,正在学习中。
我看到了这个问题关于分组,但是无法完全应用到我的问题上。
1个回答

3

使用sub函数,我们捕获一个或多个字符 (.*),接着是一个或多个数字,然后是一个可选的小数点 (\\.?) ,再紧随其后的是一个或多个数字,这被作为一组进行捕获,之后跟着|和字符串末尾的其余字符。在替换中,指定了捕获组 (\\1)。

sub('^(.*[0-9]+\\.?[0-9]+)\\|.*$', '\\1', df$text)

我不会发布一个几乎相同的代码的单独答案。我只是在问,因为我没有在问题中找到仅限带小数的数字的规范,而且你的答案不能用于整数,就这样... - Cath
@CathG,恐怕你的方法不行,它删除了太多的文本,但还是谢谢。 - Sam
1
@akrun 看起来完美地完成了工作,这正是我之前一直在摸索但却无法完全掌握的东西,非常感谢。 - Sam
2
@Sam,实际上应该是sub('(.*[0-9]+)\\|.*', '\\1', df$text),我只是在评论\\.[0-9]+,这将仅保留小数。 - Cath
2
@CathG 哦,我明白了,谢谢,实际上我更喜欢你的!祝你们俩好运。 - Sam
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接