如何在R gsub中返回匹配的正则表达式

时间:2015-05-22 22:37:20

标签: regex r

这是非常基本的,但我似乎无法找到如何在R中的正则表达式中返回已经匹配的表达式。

例如,假设我想在初始后添加句点,例如将"Joe J Smith"更改为"Joe J. Smith"

我的方法是使用gsub("(?<=\\s|^)[A-Z](?=\\S|$)","\\1.",string,perl=T)。 (我不是正则表达式的专家,但我认为\\1$1会返回匹配的表达式,即"J"给出的字符串。

但是,没有,因为这会返回:"Joe . Smith"

我确信这很简单,但我找不到任何试图在R中做类似事情的例子,它有自己的基础正则表达式。

2 个答案:

答案 0 :(得分:4)

在这种情况下,您可以使用"\\b"来引用字词边界:

> gsub("\\b([A-Z])\\b", "\\1.", "Joe J Smith")
[1] "Joe J. Smith"

关于连字符后的字母大写:

> gsub("(-.)", "\\U\\1", "Joe Jones-smith", perl = TRUE)
[1] "Joe Jones-Smith"

答案 1 :(得分:2)

像akrun所说,你需要将大写字母括起来组成一个小组。这就是 The backreference '\N', where 'N = 1 ... 9', matches the substring previously matched by the Nth parenthesized subexpression of the regular expression. (This is an extension for extended regular expressions: POSIX defines them only for basic ones.) 所说的:

R>x
[1] "joe J smith"
R>gsub("(?<=\\s|^)([A-Z])(?=\\s|$)","\\1.",x,perl=TRUE)
[1] "joe J. smith"

添加parens给出了这个例子:

{{1}}