在保持相同字符的同时,用分号替换逗号后跟一个字符

时间:2017-12-05 15:56:38

标签: r regex

提供了这样的矢量:test = "Education & research,Non-Profit (NGOs, foundations, associations...),Government (local, regional, national),Individuals,Other"我想替换所有后跟alhpa字符(不是空格)的逗号,同时保留原始字母字符,这样我以后可以拆分多个通过分号分割单元格内的值。

到目前为止,我使用了以下代码:

> gsub(",\\S", ";", test)
[1] "Education & research;on-Profit (NGOs, foundations, associations...);overnment (local, regional, national);ndividuals;ther"

正如你所看到的,我已经替换了所有逗号(这很好!)但我也删除了跟随它们的第一个字母! (那是错的!)。如果我输入gsub(",[A-Z]", ";", test)

,我会得到相同的结果

这就是我尝试

的原因
> gsub(",[A-Z]", ";[A-Z]", test)
[1] "Education & research;[A-Z]on-Profit (NGOs, foundations, associations...);[A-Z]overnment (local, regional, national);[A-Z]ndividuals;[A-Z]ther"

但是,替换品似乎不接受[A-Z]作为原始角色的替换令牌。

有没有办法实现我想要的目标?

1 个答案:

答案 0 :(得分:3)

你可以使用积极的前瞻。 积极前瞻断言给定的子模式可以在该位置匹配而不消耗字符

正则表达式替换在替换方式上是相当直观的。所以,正如您所见,实际上使用了;[A-Z]的替代品。实现所需内容的另一种方法是使捕获组的下一个字符成为正则表达式,([A-Z]),并使用;$1的替换(此处$1是对捕获组1)中最近匹配的文本。虽然团队可以做到这一点,但对于你实际上不想替换的东西(在这种情况下是大写字符),使用断言通常会更好,我的答案在下面提供。

代码

See regex in use here

,(?=[A-Z])

对于Unicode支持,您可以使用,(?=\p{Lu})\p{Lu}表示任何脚本/语言中的任何大写字符。例如,这将匹配É,而[A-Z]则不匹配。

替换:;

用法

gsub(",(?=[A-Z])",";","Education & research,Non-Profit (NGOs, foundations, associations...),Government (local, regional, national),Individuals,Other", perl=TRUE)

注意:此正则表达式使用正向前瞻,因此gsub需要传递perl=TRUE

结果

输入

  

教育与培训研究,非营利组织(非政府组织,基金会,   协会......),政府(地方,区域,   国家),个人,其他

输出

Education & research;Non-Profit (NGOs, foundations, associations...);Government (local, regional, national);Individuals;Other

说明

  • ,匹配文字逗号
  • (?=[A-Z])确保后面的内容符合大写ASCII字母
  • 的正向前瞻