R语言gsub删除{}内内容与点开头词汇报错解决方案
问题根源
你写的正则无法运行、匹配失败有三个核心原因:
- 大括号
{在正则语法中是表示匹配重复次数的特殊元字符,直接书写{不会被识别为字面量的左大括号符号,会触发正则语法错误,必须加转义符。R的字符串中写正则转义需要用双反斜杠\\。 - 你写的
^[.]\w*里的^是锚定整个字符串起始位置的元字符,只能匹配文本最开头的点号内容,完全匹配不到文本中间出现的.toc、.25em这类内容。 - 默认正则模式下
.*是贪婪匹配,且惰性匹配.*?需要启用perl兼容正则模式才会生效,否则会出现从第一个{一直匹配到最后一个}的跨范围匹配问题。
正确实现代码
按顺序执行两次替换即可覆盖你要删除的所有内容,最后可选清理多余空白:
# 原始文本定义 text<-"\n\n\n\n\nThe Project Gutenberg eBook of Moby Dick; Or the Whale, by Herman Melville\n\n\n\n body {margin-left:15%; margin-right:15%; text-align:justify }\n p { text-indent: 1em; margin-top: .25em; margin-bottom: .25em; }\n H1,H2,H3,H4,H5,H6 { text-align: center; margin-left: 15%; margin-right: 15%; }\n hr { width: 50%; text-align: center;}\n blockquote {font-size: 100%; margin-left: 0%; margin-right: 0%;}\n .mynote {background-color: #DDE; color: #000; padding: .5em; margin-left: 10%; margin-right: 10%; font-family: sans-serif; font-size: 95%;}\n .toc { margin-left: 10%; margin-bottom: .75em;}\n pre { font-family: times new roman; font-size: 100%; margin-left: 10%;}\n\n" # 1. 移除所有大括号及内部包裹的全部内容 text_processed <- gsub("\\{.*?\\}", "", text, perl = TRUE) # 2. 移除所有.开头的内容,覆盖.toc、.mynote、.25em、.5em这类场景 text_processed <- gsub("\\.[A-Za-z0-9]+", "", text_processed, perl = TRUE) # 可选:清理多余的连续空格、换行、缩进 text_processed <- trimws(gsub("\\s+", " ", text_processed))
处理结果
执行完上述代码后,输出结果为:
[1] "The Project Gutenberg eBook of Moby Dick; Or the Whale, by Herman Melville body p H1,H2,H3,H4,H5,H6 hr blockquote pre"
如果你不需要保留CSS选择器部分的body/p/pre这类标签,可以再加一步规则过滤对应位置的内容即可。
内容的提问来源于stack exchange,提问作者Adi Cohen
相关产品推荐
相关产品推荐

