将数字放在括号中不是负数

时间:2014-06-24 03:59:51

标签: regex r

我试图将所有数字放在不包含负值的括号中,但使用单词边界似乎不起作用。

x <- '125 -110 55 25 135 -145 10 -199'
gsub('\\b(\\d+)', '(\\1)', x)

上面将所有数字放在括号中,单词边界似乎也与负数匹配。我该如何解决这个问题?

只有125552513510应放在括号中。

3 个答案:

答案 0 :(得分:2)

原因是连字符被视为边界。你需要一个 Negative Lookbehind

x <- '125 -110 55 25 135 -145 10 -199'
gsub('(?<![\\d-])(\\d+)', '(\\1)', x, perl=T)

# [1] "(125) -110 (55) (25) (135) -145 (10) -199"

<强>解释

(?<!         # look behind to see if there is not:
  [\d-]      #   any character of: digits (0-9), '-'
)            # end of look-behind

答案 1 :(得分:2)

所以\b不起作用?创造你自己的界限!

使用此:

grepl("(?<![-\\d])\\d\\d*", subject, perl=TRUE);

请参阅demo

正则表达式(没有转义)是(?<![-\d])\d\d*

<强>解释

  • 负面的后视(?<![-\d])断言前面的内容不是连字符或数字。从本质上讲,这是你的DIY界限。 :)
  • \d匹配第一个数字
  • \d*匹配任何尾随数字

<强>参考

答案 2 :(得分:1)

strsplit,因为我必须

> s <- strsplit(x, " ")[[1]]
> s[!grepl("\\-", s)] <- paste0("(", s[!grepl("\\-", s)], ")")  
> paste(s, collapse = " ")
# [1] "(125) -110 (55) (25) (135) -145 (10) -199"