【问题标题】:How to put a space in between a list of strings?如何在字符串列表之间放置一个空格?
【发布时间】:2019-03-16 14:52:30
【问题描述】:

这是我当前的数据集:

c("Jetstar","Qantas", "QantasLink","RegionalExpress","TigerairAustralia", 
   "VirginAustralia","VirginAustraliaRegionalAirlines","AllAirlines", 
   "Qantas-allQFdesignatedservices","VirginAustralia-allVAdesignatedservices")

我想在航空公司名称之间添加一个空格并用空格分隔。

为此,我尝试了以下代码:

airlines$airline <- gsub("([[:lower:]]) ([[:upper:]])", "\\1 \\2", airlines$airline)

但是我得到的文本格式和以前一样。

我想要的输出如下:

【问题讨论】:

  • ([[:lower:]])([[:upper:]]) 之间留出空格。请不要使用图片提供您的数据。例如,请改用 dput
  • @kath,谢谢你的建议。但放置空间并没有帮助。
  • 我建议把两者之间的空格去掉。
  • 如果您以可重现的格式提供数据,则更容易为您提供帮助。
  • @ronak shah,感谢您的编辑。

标签: r regex string


【解决方案1】:
txt <- c("Jetstar","Qantas", "QantasLink","RegionalExpress","TigerairAustralia", 
"VirginAustralia","VirginAustraliaRegionalAirlines","AllAirlines", 
"Qantas-allQFdesignatedservices","VirginAustralia-allVAdesignatedservices")

您需要两种不同的规则:一种用于大小写更改之前的空格,另一种用于重复出现的单词(“指定”、“服务”)或符号(“-”)。您可以从一个模式开始,该模式标识一个小写字符,后跟一个大写字符(使用“[AZ]”之类的字符类标识),然后在两个捕获类中的这两个字符之间插入一个空格(在一个部分周围用括号创建)的一种模式)。请参阅?regex 详细信息部分以快速了解字符类和捕获类:

gsub("([a-z])([A-Z])", "\\1 \\2", txt)

然后,您使用该结果作为参数,在文本中您想要分隔的任何重复出现的单词之前添加一个空格:

gsub("(-|all|designated|services)", " \\1", # second pattern and sub for "specials"
gsub("([a-z])([A-Z])", "\\1 \\2", txt))  #first pattern and sub for case changes

 [1] "Jetstar"                                      
 [2] "Qantas"                                       
 [3] "Qantas Link"                                  
 [4] "Regional Express"                             
 [5] "Tigerair Australia"                           
 [6] "Virgin Australia"                             
 [7] "Virgin Australia Regional Airlines"           
 [8] "All Airlines"                                 
 [9] "Qantas - all QF designated services"          
[10] "Virgin Australia - all VA designated services"

我看到有人赞成我之前对Splitting CamelCase in R 的回答,这与我之前的回答相似,但这个回答还有一些皱纹需要解决。

【讨论】:

    【解决方案2】:

    这(几乎)可以解决问题

    gsub("([A-Z])", " \\1", airlines) 
    

    借自:splitting-camelcase-in-r

    当然,像 Qantas-allQFd... 这样的名称仍然会造成问题,因为字符串的第二部分中有两个连续的大写字母(“QF”)。

    【讨论】:

    • 我猜你赞成我对拆分 camelCase Q 的回答。不知道是谁反对这个。不是我。我决定对这个模式使用“成对的上下序列”来解决你引用的相邻上层问题。
    【解决方案3】:

    我试图弄清楚并且我想出了一些东西:

    library(stringr)
    
    data_vec<- c("Jetstar","Qantas", "QantasLink","RegionalExpress","TigerairAustralia", 
      "VirginAustralia","VirginAustraliaRegionalAirlines","AllAirlines", 
      "Qantas-allQFdesignatedservices","VirginAustralia-allVAdesignatedservices")
    
    
    str_trim(gsub("(?<=[A-Z]{2})([a-z]{1})", " \\1",gsub("([A-Z]{1,2})", " \\1", data_vec)))
    
    

    我希望这会有所帮助。

    【讨论】:

    • 不要忘记设置perl =TRUE,因为我使用的是lookbehind。
    猜你喜欢
    • 1970-01-01
    • 2016-06-13
    • 1970-01-01
    • 1970-01-01
    • 2018-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多