1

我有以下变量名向量:

vn <- c("id", "pid", "wave", "psex", "pdobd", "pdobm", "pdoby", "psat3", 
"ppa21i1", "psd23i19")

我很难想出一个适当的正则表达式来删除所有第一个 p,但不是“pid”的那个。

sub(???, "", vn) ## I tried "^p[^id]?" but to no avail...

因此,结果将如下所示:

c("id", "pid", "wave", "sex", "dobd", "dobm", "doby", "sat3", 
"pa21i1", "sd23i19")
4

3 回答 3

7

您需要使用零宽度断言(负前瞻)

^p(?!id)

不要忘记将 perl 参数设置为 TRUE

于 2013-06-21T16:23:55.263 回答
4

如果您以肯定的方式表达您的要求,通常更容易提出正确的正则表达式:不是“如果它以'p'开头则拒绝,除非它是'pid'”,而是“如果它不以'开头则接受” p',或者它是 'pid'"

^([^p].*)|pid$ 
于 2013-06-21T16:25:42.623 回答
2

稍微笨拙的解决方案:更改pidppid,然后照常进行。

sub("^p", "", sub("^pid", "ppid", vn))
于 2013-06-21T16:23:48.997 回答