正则表达式 R 将标点符号与保留 "e.g." 和 "i.e." 的文本分开

Regex R separate punctuation from text preserving "e.g." and "i.e."

我想在 R 中将标点符号与文本分开(在基于 space 进行标记化之前)。

命令:gsub("(?:\b| )?([.,:;!?]+)(?: |\b)?", " \1 ", "Blabla, i.e. blabla...")

输出:"Blabla , i . e . blabla ... "

如您所见,... 被视为一个单元,没有被分解。如何为 i.e(和 e.g.)实现同样的事情?

为了清楚起见,期望的输出是:"Blabla , i.e. blabla ... "

如果您只对 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 and a 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)

Another regex demo