亲爱的stackoverflow用户,
许多人遇到需要修改字符串的情况。我见过很多 与字符串修改相关的帖子。但是,我没有遇到我正在寻找的解决方案 对于。我相信我的帖子对于其他会面临类似问题的R用户会很有用 挑战。我想向熟悉字符串的R用户寻求帮助 修改
我一直在尝试修改如下字符串。
x <- "Marcus HELLNERJohan OLSSONAnders SOEDERGRENDaniel RICHARDSSON"
此字符串中有四个人。姓氏用大写字母表示。 四个姓氏中有三个与名字保持一致(例如,HELLNERJohan)。 我想分开姓氏和名字以增加空间(例如,HELLNER Johan)。
我想我需要陈述类似“选择大写字母的序列,以及 如果有小写,则在最后一个和最后一个大写字母之间添加空格 以下信件。“
以下帖子可能有些相关,但我还没有成功编写代码。
Splitting String based on letters case
非常感谢您的慷慨支持。
答案 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"