【问题标题】:Adding space in a specific position in a string of uppercase and lowercase letters在大小写字母字符串的特定位置添加空格
【发布时间】:2014-04-04 00:11:29
【问题描述】:

尊敬的 stackoverflow 用户,

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

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

x <- "Marcus HELLNERJohan OLSSONAnders SOEDERGRENDaniel RICHARDSSON"

这个字符串中有四个人。姓氏用大写字母。 四分之三的姓与名字(例如,HELLNERJohan)保持一致。 我想用空格分隔姓氏和名字(例如,HELLNER Johan)。

我想我需要说明“选择大写字母序列,并且 如果有小写字母,则在最后一个和倒数第二个大写字母之间添加空格 后面的字母。”

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

Splitting String based on letters case

非常感谢您的慷慨支持。

【问题讨论】:

  • 滑雪爱好者,嗯?去瑞典!
  • “Marcus”的姓氏是什么?
  • @RichScriven NA

标签: string r gsub


【解决方案1】:

这通过查找和捕获两个连续的子模式来工作,第一个由一个大写字母组成(姓氏的结尾),下一个由一个大写字母组成,然后是一个小写字母(用来表示名字的开头)。无论在哪里找到这两个组,它们都会被捕获并由它们自己替换,并在它们之间插入一个空格(下面的调用中的"\\1 \\2")。

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

【讨论】:

  • 非常感谢乔希。现在我又学到了关于字符串修改的一件事。
【解决方案2】:

如果您想将向量分成名称向量,这将使用具有零宽度后向和前向断言的正则表达式拆分字符串。

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

【讨论】:

  • 非常感谢,蓝。最后,我需要提取每个名称。所以你的建议很有帮助!
猜你喜欢
  • 1970-01-01
  • 2021-08-18
  • 2011-06-16
  • 1970-01-01
  • 2023-03-22
  • 2020-08-15
  • 1970-01-01
  • 2021-01-06
  • 2021-09-25
相关资源
最近更新 更多