在没有任何字符分组后替换字符

时间:2015-12-09 12:16:38

标签: regex r dataframe

我有一个带有文本列的大型csv,其最大宽度为200.几乎在所有情况下数据都很好。在某些情况下,数据太长或者没有正确填充,我想使用正则表达式来查找特定数字/字符配对的最后一个实例,然后删除它之后的所有内容。

例如数据:

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|"))

我的特定字符对是任何数字后跟|

这意味着第1行是正常的,第2行将删除'10 .2'后的所有内容,第3行将删除0.48之后的所有内容

我试过这个正则表达式:

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

它几乎已经接近工作了但是我的数据中只有少数几行中有一个数字出现在解释中并没有发挥作用。有线索吗?我还不是一个伟大的正规算,学习绳索

我看到this question关于分组,但不能完全应用于我的问题。

1 个答案:

答案 0 :(得分:3)

使用sub,我们捕获一个或多个字符(.*),后跟一个或多个数字,后跟一个点(如果存在)(\\.?)后跟一个或多个数字作为一个组后跟|和其余字符,直到字符串结束。在替换中,指定了捕获组(\\1)。

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