从R中的regexp类中删除字符

时间:2015-05-18 21:59:56

标签: regex r regex-negation

编辑:更改整个问题以使其更清晰。

我可以从R中的一个正则表达式类中删除单个字符(例如[:alnum:])吗?

例如,匹配除[:punct:]字符以外的所有标点符号(_)。

我正在尝试将markdown中使用的替换下划线用于斜体,但斜体子字符串可能包含一个我想要保留的下划线。

编辑:作为另一个例子,我想要捕获成对的下划线之间的所有内容(注意,一对包含一个我希望保持在1到10之间的下划线)

This is _a random_ string with _underscores: rate 1_10 please_

3 个答案:

答案 0 :(得分:3)

你不会相信它,但lazy matching只用?就可以达到预期效果:

str <- 'This is a _string with_ some _random underscores_ in it.'
gsub("_+([[:print:]]+?)_+", "\\1", str)
str <- 'This is a _random string with_ a scale of 1_10.'
gsub("_+([[:print:]]+?)_+", "\\1", str)

结果:

[1] "This is a string with some random underscores in it."
[1] "This is a random string with a scale of 1_10."

以下是demo program

然而,如果您想要修改[[:print:]]课程,请注意它基本上是[\x20-\x7E]范围。下划线为\x5F,您可以轻松地将其从范围中排除,并使用[\x20-\x5E\x60-\x7E]

str <- 'This is a _string with_ some _random underscores_ in it.'
gsub("_+([\x20-\x5E\x60-\x7E]+)_+", "\\1", str)

Returns

[1] "This is a string with some random underscores in it."

答案 1 :(得分:1)

与@stribizhev相似:

x <- "This is _a random_ string with _underscores: rate 1_10 please_"
gsub("\\b_(.*?)_\\b", "\\1", x, perl=T)

产生

[1] "This is a random string with underscores: rate 1_10 please"

这里我们使用单词边界和懒惰匹配。请注意,默认的regexp引擎存在延迟重复和捕获组的问题,因此您可能希望使用perl=T

答案 2 :(得分:0)

gsub('(?<=\\D)\\_(?=\\D|$)','',str,perl=T)