我是正则表达的新来者,所以请耐心等待。
我有一个这样的字符串:
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."
知道如何纠正我的代码吗?谢谢!
答案 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);
并将其替换为空。
答案 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"