除了某些单词之外,我想从段落中删除所有数字。
我的尝试是使用否定的预测:
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'
答案 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)