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)
向前看 (?<!\w)
确保 #
之前没有字母、数字或下划线,(?!\w)
向前看确保没有字母、数字或下划线后面加下划线。
为避免过度转义,您可以将散列放入字符 class:
"(?<!\w)[#]+(?!\w)"
在散列符号后使用 +
量词将确保多个连续的散列被替换为一个词 "hash"。
更新
应该适用于您的更新示例的解决方案:
gsub("(?<!\w|#)[#](?!\w|#)", "hash", text100, perl=T)
这里,(?<!\w|#)
将确保散列前面没有单词字符或散列符号,而 (?!\w|#)
否定前瞻将确保没有单词字符或散列哈希符号后的符号。
虽然 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)
向前看 (?<!\w)
确保 #
之前没有字母、数字或下划线,(?!\w)
向前看确保没有字母、数字或下划线后面加下划线。
为避免过度转义,您可以将散列放入字符 class:
"(?<!\w)[#]+(?!\w)"
在散列符号后使用 +
量词将确保多个连续的散列被替换为一个词 "hash"。
更新
应该适用于您的更新示例的解决方案:
gsub("(?<!\w|#)[#](?!\w|#)", "hash", text100, perl=T)
这里,(?<!\w|#)
将确保散列前面没有单词字符或散列符号,而 (?!\w|#)
否定前瞻将确保没有单词字符或散列哈希符号后的符号。