正则表达式R从保留“eg”的文本中分隔标点符号和“即”

时间:2016-01-18 14:56:06

标签: regex r gsub

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

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

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

正如您所看到的,...被视为一个单元并且没有被细分。如何为i.e(和e.g.)实现同样的目标?

为清楚起见,所需的输出为:"Blabla , i.e. blabla ... "

1 个答案:

答案 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 demoregex 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