R中正则表达式中标点符号的词边界处理

Word boundaries handling for punctuation characters in regexp in R

虽然 Replace two dots in a string with gsub 回答了有关替换标点字符(如“.”)的问题,但它似乎不适用于单词边界。例如,

text100 <- "My # is 1234"
text1 <- gsub("\b#\b","hash",text100)
> text1
[1] "My # is 1234"

# 没有被替换。如何解决这个问题?

注意不要替换多个#。例如,

'##' 不应替换为 'hash' 或 'hashhash'。

# 后面或前面应该有任何图形字符 不被替换(例如,'.#'不应该被替换)

您的正则表达式不起作用,因为散列不是单词字符,您需要在散列的两边都有一个单词字符。

如果要确保 # 符号周围没有单词字符,请使用 Perl 样式的正则表达式替换:

text100 <- "My # is 1234"
gsub("(?<!\w)\#+(?!\w)","hash",text100, perl=T)

IDEONE demo

向前看 (?<!\w) 确保 # 之前没有字母、数字或下划线,(?!\w) 向前看确保没有字母、数字或下划线后面加下划线。

为避免过度转义,您可以将散列放入字符 class:

"(?<!\w)[#]+(?!\w)"

在散列符号后使用 + 量词将确保多个连续的散列被替换为一个词 "hash"。

更新

应该适用于您的更新示例的解决方案:

gsub("(?<!\w|#)[#](?!\w|#)", "hash", text100, perl=T)

这里,(?<!\w|#) 将确保散列前面没有单词字符或散列符号,而 (?!\w|#) 否定前瞻将确保没有单词字符或散列哈希符号后的符号。

another demo