使用stringr删除最后一个空格后的所有内容

5

我有这样的数据:

df <- tribble(
    ~name, ~value,
    "Jake Lake MLP", 10, 
    "Bay May CE", 5,
    "Drake Cake Jr. DSF", 9.1,
    "Sam Ram IR QQQZ", 1
)

我想要剪裁所有名称,使它们变得更加简洁:

"Jake Lake",
"Bay May", 
"Drake Cake Jr.",
"Sam Ram IR"

基本上是删除最后一个空格后的所有内容。
我尝试过:
df %>% mutate(name = str_replace(name, "\\s.*$", ""))

但这还不是我想要的!


4
你可以实际上从未被接受的回答中获取正则表达式,该回答位于https://dev59.com/vHrZa4cB1Zd3GeqPyBby。 - Wiktor Stribiżew
1个回答

9
我们可以使用sub
df %>% 
    mutate(name = sub("\\s+[^ ]+$", "", name))

或者在 str_replace 中使用相同的模式

df %>% 
   mutate(name = str_replace(name, "\\s[^ ]+$", ""))
# A tibble: 4 × 2
#            name value
#           <chr> <dbl>
#1      Jake Lake  10.0
#2        Bay May   5.0
#3 Drake Cake Jr.   9.1
#4     Sam Ram IR   1.0

该模式表示一个空格 (\\s),后面是一个或多个非空格字符(否则可以使用 \\S+),一直到字符串的结尾并用空白 "" 替换。在 OP 的代码中,它是不具体的 (.*)。

你能解释一下正则表达式中的 +[^ ]+ 是什么意思吗?我理解 \s 和 $……只是不明白中间的部分。 - emehex
每当我们在方括号内使用 ^ 并且还有另一个字符(这里是空格)时,它的意思是匹配除了空格以外的任何字符。 - akrun
明白了。我不喜欢被重复使用的 ^ ... 我只知道它是 $ 的相反。 - emehex
如果您将其作为独立使用,则表示字符串的开头。因此,它的含义不同。 - akrun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接