我想将标点符号与R中的文本分开(在基于空格的标记化之前)。
命令:gsub("(?:\b| )?([.,:;!?]+)(?: |\b)?", " \\1 ", "Blabla, i.e. blabla...")
输出:"Blabla , i . e . blabla ... "
正如您所看到的,...
被视为一个单元并且没有被细分。如何为i.e
(和e.g.
)实现同样的目标?
为清楚起见,所需的输出为:"Blabla , i.e. blabla ... "
答案 0 :(得分:3)
如果您只对i.e.
和e.g.
感兴趣,可以将它们放在列表中以跳过,并匹配所有其他标点符号:
gsub("\\b(?:e\\.g\\.|i\\.e\\.)(*SKIP)(*F)|(\\pP+)", " \\1 ",
"Blabla, i.e. e.g. blabla...",
perl=T)
## => [1] "Blabla , i.e. e.g. blabla ... "
请参阅this IDEONE demo和regex demo
解释:
\\b(?:e\\.g\\.|i\\.e\\.)(*SKIP)(*F)
- 匹配整个单词e.g.
或i.e.
并跳过它们|
- 或(\\pP+)
- 匹配并捕获第1组中的一个或多个标点符号要保持修剪,请使用
gsub("\\b(?:e\\.g\\.|i\\.e\\.)(*SKIP)(*F)|(?:\\b|\\h+)?(\\pP+)(?:\\b|\\h+)?", " \\1 ",
"Blabla, i.e. e.g. blabla...",
perl=T)