R:删除文本中的点,但不标记小数点

时间:2017-10-10 22:55:49

标签: r regex string gsub

我是正则表达的新来者,所以请耐心等待。

我有一个这样的字符串:

txt1 <- 'a,b,a.b,a.,1,2,1.2,1.,.,11,222,11.222,11.'

想象一下,它来自.csv,每个单元格都以','分隔。现在我想删除所有'。'除了那些标记小数点。在这方面,我想最终得到这样的结论:

txt2 <- 'a,b,ab,a,1,2,1.2,1,,11,222,11.222,11'

我尝试过以下代码:

txt2 <- gsub(pattern = '[^a-z0-9,(\\d\\.\\d)]', replacement = '', text = txt1)
txt2 <- gsub(pattern = '[^a-z0-9,|(\\d\\.\\d)]', replacement = '', text = txt1)

但两种都不起作用,都返回

> print(txt2)
[1] "a,b,a.b,a.,1,2,1.2,1.,.,11,222,11.222,11."

知道如何纠正我的代码吗?谢谢!

3 个答案:

答案 0 :(得分:3)

关键是使用负面后顾问?<!和否定前瞻?!

> txt1 <- 'a,b,a.b,a.,1,2,1.2,1.,.,11,222,11.222,11.'
> txt2 <- gsub(pattern='((?<![0-9])\\.)|(\\.(?![0-9]))', replacement='', x=txt1, perl=TRUE)
> txt2
[1] "a,b,ab,a,1,2,1.2,1,,11,222,11.222,11"

此模式匹配句点\\.,该句点由不是0-9的字符或后跟不是0-9的字符的句点继续。您必须为R设置perl=TRUE以识别后视和前瞻。

这会修剪前导字符,因此'。''将变为'2'。如果不需要,那么lookbehind必须是(?<![0-9,])

答案 1 :(得分:0)

您可以使用否定前瞻。匹配$state.reload().then(futureFunc); 并将其替换为空。

https://regex101.com/r/LNHYOY/1

答案 2 :(得分:0)

否定先行(由@CAustin建议)似乎是最优雅和简洁的。

由于以上解决方案均未提供实际的R代码,因此它是:

txt2 <- gsub("\\.(?!\\d)", "", txt1, perl = TRUE)
[1] "a,b,ab,a,1,2,1.2,1,,11,222,11.222,11"