在大写和小写字母的字符串中添加特定位置的空间

时间:2014-03-03 03:56:58

标签: string r gsub

亲爱的stackoverflow用户,

许多人遇到需要修改字符串的情况。我见过很多 与字符串修改相关的帖子。但是,我没有遇到我正在寻找的解决方案 对于。我相信我的帖子对于其他会面临类似问题的R用户会很有用 挑战。我想向熟悉字符串的R用户寻求帮助 修改

我一直在尝试修改如下字符串。

x <- "Marcus HELLNERJohan OLSSONAnders SOEDERGRENDaniel RICHARDSSON"

此字符串中有四个人。姓氏用大写字母表示。 四个姓氏中有三个与名字保持一致(例如,HELLNERJohan)。 我想分开姓氏和名字以增加空间(例如,HELLNER Johan)。

我想我需要陈述类似“选择大写字母的序列,以及 如果有小写,则在最后一个和最后一个大写字母之间添加空格 以下信件。“

以下帖子可能有些相关,但我还没有成功编写代码。

Splitting String based on letters case

非常感谢您的慷慨支持。

2 个答案:

答案 0 :(得分:5)

这可以通过查找和捕获两个连续的子模式来实现,第一个包含一个大写字母(系列名称的末尾),另一个包含一个大写字母和一个小写字母(用来表示开始一个名字)。找到这两个组的任何地方,它们被捕获并被自己替换,并在其间插入一个空格(下面的调用中的"\\1 \\2")。

x <- "Marcus HELLNERJohan OLSSONAnders SOEDERGRENDaniel RICHARDSSON"
gsub("([[:upper:]])([[:upper:]][[:lower:]])", "\\1 \\2", x)
# "Marcus HELLNER Johan OLSSON Anders SOEDERGREN Daniel RICHARDSSON"

答案 1 :(得分:0)

如果要将向量分隔为名称向量,则使用带有零宽度lookbehind和lookahead断言的正则表达式拆分字符串。

strsplit(x, split = "(?<=[[:upper:]])(?=[[:upper:]][[:lower:]])", 
  perl = TRUE)[[1]]
# [1] "Marcus HELLNER"     "Johan OLSSON"       "Anders SOEDERGREN" 
# [4] "Daniel RICHARDSSON"