1

虽然用 gsub 替换字符串中的两个点回答了有关替换标点符号(如“.”)的问题,但它似乎不适用于单词边界。例如,

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

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

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

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

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

4

1 回答 1

5

您的正则表达式不起作用,因为散列不是单词字符,并且您需要单词字符位于散列的两侧。

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

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

IDEONE 演示

后视(?<!\\w)确保 前没有字母、数字或下划线#(?!\\w)前瞻确保其后没有字母、数字或下划线。

为避免过度转义,您可以将哈希放入字符类中:

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

在哈希符号后使用+量词将确保多个连续的哈希被一个单词“哈希”替换。

更新

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

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

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

查看另一个演示

于 2015-10-12T15:38:39.040 回答