编辑:更改整个问题以使其更清晰。
我可以从R中的一个正则表达式类中删除单个字符(例如[:alnum:]
)吗?
例如,匹配除[:punct:]
字符以外的所有标点符号(_
)。
我正在尝试将markdown中使用的替换下划线用于斜体,但斜体子字符串可能包含一个我想要保留的下划线。
编辑:作为另一个例子,我想要捕获成对的下划线之间的所有内容(注意,一对包含一个我希望保持在1到10之间的下划线)
This is _a random_ string with _underscores: rate 1_10 please_
答案 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)
[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)