代码之家  ›  专栏  ›  技术社区  ›  phil_t

将“firstname lastname”更改为“firstname,firstname”

  •  2
  • phil_t  · 技术社区  · 7 年前

    我有一个名字列表,需要从“firstname lastname”转换为“firstname,firstname”。

    Barack Obama
    Donald J. Trump
    J. Edgar Hoover
    Beyonce Knowles-Carter
    Sting
    

    我用G.Grothendieck的回答 "last name, first name" -> "first name last name" in serialized strings 到达 gsub("([^ ]*) ([^ ]*)", "\\2, \\1", str) 这给了我-

    Obama, Barack
    J., DonaldTrump, 
    Edgar, J.Hoover, 
    Knowles-Carter, Beyonce
    Sting
    

    我想要什么-

    Obama, Barack
    Trump, Donald J. 
    Hoover, J. Edgar
    Knowles-Carter, Beyonce
    Sting
    

    我想要一个正则表达式的答案。

    2 回复  |  直到 7 年前
        1
  •  5
  •   Martin Schmelzer    7 年前

    使用

    gsub("(.*[^van])\\s(.*)", "\\2, \\1", people)
    

    正则表达式:

    (.*[^van])                                         \\s                      (.*)
    Any ammount of characters exluding "van"...  the last white space...  The last name containing any character.
    

    数据:

    people <- c("Barack Obama",
                "Donald J. Trump",
                "J. Edgar Hoover",
                "Beyonce Knowles-Carter",
                "Sting",
                "Ruud van Nistelrooy",
                "Xi Jinping",
                "Hans Zimvanmer")
    

    结果:

        [1] "Obama, Barack"           "Trump, Donald J."        "Hoover, J. Edgar"       
    [4] "Knowles-Carter, Beyonce" "Sting"                   "van Nistelrooy, Ruud"   
    [7] "Jinping, Xi"             "Zimvanmer, Hans" 
    
        2
  •  5
  •   James    7 年前

    有一个称为 person 设计用于保存名称,转换函数 as.person 你和一个 format 方法之后使用它(创造性地使用大括号参数)。它甚至适用于复杂的姓氏(如van nistelrooy),但单名结果并不令人满意。它可以很快结束 sub 不过。

    x <- c("Barack Obama","Donald J. Trump","J. Edgar Hoover","Beyonce Knowles-Carter","Sting", "Ruud van Nistelrooy", "John von Neumann")
    y <- as.person(x)
    
    format(y, include=c("family","given"), braces=list(family=c("",",")))
    [1] "Obama, Barack"           "Trump, Donald J."       
    [3] "Hoover, J. Edgar"        "Knowles-Carter, Beyonce"
    [5] "Sting,"                  "van Nistelrooy, Ruud"   
    [7] "von Neumann, John"
    
    ## fix for single names - curse you Sting!
    
    sub(",$", "", format(y, include=c("family","given"), braces=list(family=c("",","))))
    [1] "Obama, Barack"           "Trump, Donald J."       
    [3] "Hoover, J. Edgar"        "Knowles-Carter, Beyonce"
    [5] "Sting"                   "van Nistelrooy, Ruud"   
    [7] "von Neumann, John"