如何删除遵循特定模式的字符串的一部分,但不包括使用 R 的另一个模式?

How do I remove part of a string that follows a certain pattern up to, but not including another pattern using R?

我在 R 中有一个包含人员数据的数据框。字符串的第一部分是全名。每隔一段时间,我就会遇到括号中的昵称。括号中可能还有其他我不想删除的数据。这是我正在使用的一种数据的示例:

Name <- c(
    "JOSEPH RYAN SMITH (USRID1)",
    "ANDREA J LOPEZ RAMIREZ (USRID2) (CONTRACTOR)",
    "TIMOTHY (TIM) JOHNSON (USRID3) (INTERN)",
    "JESSICA JENNIFER JONES (USRID4) (CONTRACTOR)",
    "WILLIAM (BILLIE) JOEL (USRID5)")
df <- as.data.frame(Name)

我得到:

                                         Name
1                   JOSEPH RYAN SMITH (USRID1)
2 ANDREA J LOPEZ RAMIREZ (USRID2) (CONTRACTOR)
3      TIMOTHY (TIM) JOHNSON (USRID3) (INTERN)
4 JESSICA JENNIFER JONES (USRID4) (CONTRACTOR)
5               WILLIAM (BILLIE) JOEL (USRID5)

我只想删除昵称。我注意到昵称的不同之处在于它总是在括号中并且总是跟在姓氏之后。括号中包含的所有其他指示符后跟“(”或记录结尾。我试图删除括号中后跟 space 和字符 A-Z 的字符串。

df$Name <- str_remove(df$Name, "[\(][A-Z]+[\)][ ][A-Z]")

这去掉了姓氏的第一个字母,给了我:

 Name
1                   JOSEPH RYAN SMITH (USRID1)
2 ANDREA J LOPEZ RAMIREZ (USRID2) (CONTRACTOR)
3             TIMOTHY OHNSON (USRID3) (INTERN)
4 JESSICA JENNIFER JONES (USRID4) (CONTRACTOR)
5                         WILLIAM OEL (USRID5)

我也没有成功试过像这样“没有跟着(”:

df$Name <- str_remove(df$Name, "[\(][A-Z]+[\)][ ][^\(]")

我尝试了其他一些操作,这些操作删除了括号中我确实需要保留的其他指标。任何帮助表示赞赏。谢谢。

使用正 lookeahd (?=) 以便匹配但不删除姓氏的第一个字母。

stringr::str_remove(df$Name, "\([A-Z]+\)\s(?=[A-Z])")

#[1] "JOSEPH RYAN SMITH (USRID1)"                  
#[2] "ANDREA J LOPEZ RAMIREZ (USRID2) (CONTRACTOR)"
#[3] "TIMOTHY JOHNSON (USRID3) (INTERN)"           
#[4] "JESSICA JENNIFER JONES (USRID4) (CONTRACTOR)"
#[5] "WILLIAM JOEL (USRID5)" 

你也可以用 sub 在 base R 中写这个:

sub('\([A-Z]+\)\s(?=[A-Z])', '', df$Name, perl = TRUE)