R

时间:2015-10-12 15:34:25

标签: regex r punctuation word-boundary word-break

虽然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'。

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

1 个答案:

答案 0 :(得分:5)

你的正则表达式不起作用,因为哈希不是一个单词字符,你需要一个单词字符在哈希的两边。

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

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

请参阅IDEONE demo

后视(?<!\\w)确保#之前没有字母,数字或下划线,(?!\\w)前瞻确保后面没有字母,数字或下划线它

为避免过度捕获,您可以将哈希放入字符类:

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

在哈希符号后使用+量词将确保多个连续哈希值被替换为一个词&#34;哈希&#34;。

<强>更新

为您更新的示例调整工作的解决方案:

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

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

请参阅another demo