正则表达式删除段落中的所有数字,除了一些单词

时间:2013-12-20 04:41:58

标签: regex r

除了某些单词之外,我想从段落中删除所有数字。

我的尝试是使用否定的预测:

 gsub('(?!ami.12.0|allo.12)[[:digit:]]+','',
        c('0.12','1245','ami.12.0 00','allo.12 1'),perl=TRUE)

但这不起作用。我明白了:

"."      ""       "ami.. " "allo." 

或者我的预期输出是:

"."      ""       'ami.12.0','allo.12'

2 个答案:

答案 0 :(得分:3)

你真的不能在这里使用负面预测,因为当光标位于ami之后的某个时刻它仍会被替换。

你可以做的是放回一些比赛:

(ami.12.0|allo.12)|[[:digit:]]+

gsub('(ami.12.0|allo.12)|[[:digit:]]+',"\\1",
        c('0.12','1245','ami.12.0 00','allo.12 1'),perl=TRUE)

我保留了.,因为我不能100%确定你拥有的内容,但请记住.是一个通配符,并且会匹配任何字符(除了换行符),除非你逃脱它

答案 1 :(得分:1)

你的正则表达式实际上是找到不是“ami.12.0”或“allo.12”开头的每个数字序列。例如,在第三个字符串中,它会转到12中的ami.12.0,然后查看12是否是两个忽略字符串中任意一个的开头。它不是,所以它继续替换它。最好对此进行概括,但在您的具体情况下,您可以通过对要跳过的单词的前缀(可以跟随数字序列)进行负面的后观操作来实现此目的。所以,你会使用这样的东西:

gsub('(?<!ami\\.|ami\\.12\\.|allo\\.)[[:digit:]]+','',
         c('0.12','1245','ami.12.0 00','allo.12 1'),perl=TRUE)