【问题标题】:separate (dplyr) with key in-between specific characters (after space and before capital letter)用特定字符之间的键分隔(dplyr)(在空格之后和大写字母之前)
【发布时间】:2019-06-26 17:56:19
【问题描述】:

我想 dplyr::separate 必须在空格之后和大写字母之前的减号 (-)。

我的正则表达式 [\s]-[A-Z] 包含空格和大写字母,因此通过分隔删除。我只想在该特定位置使用减号进行分隔,而不是去掉空格和后面的字母。

library(dplyr)

data.frame(x = c("Hans-Peter Wurst -My Gosh", "What is -wrong here -Do not worry")) %>% 
  separate(x, into = c("one", "two"), sep = "[\\s]-[A-Z]")

结果:

#                   one         two
# 1    Hans-Peter Wurst      y Gosh
# 2 What is -wrong here o not worry

期望的输出是:

#                   one          two
# 1    Hans-Peter Wurst      My Gosh
# 2 What is -wrong here Do not worry

【问题讨论】:

  • 好的,我重新打开它,因为我对这些谈话感到头疼

标签: r regex dplyr


【解决方案1】:

您可以将大写字母模式包装在后向/前瞻中

sep = "(?<!\\S)-(?=[A-Z])"

或者,如果必须排除字符串开头的-,则使用

sep = "(?<=\\s)-(?=[A-Z])"

regex demo

由于lookarounds 是不消耗文本的零宽度断言(它们匹配的文本不会落在整体匹配值内,它只检查模式是否匹配并返回真或假)字母将保留在输出。

详情

  • (?&lt;=\s) - 正向向后看,需要紧挨当前位置左侧的空格
  • (?&lt;!\S) - 一个否定的向后查找,需要字符串位置的开头或紧挨当前位置左侧的空格
  • - - 一个连字符
  • (?=[A-Z]) - 正向前瞻,需要在当前位置右侧紧邻大写 ASCII 字母。

【讨论】:

  • 如果要相信 OP 的文字,“没有摆脱空格和后面的字母”,可能还需要对空格使用后视。跨度>
  • @Gregor 很公平,我将\s+ 替换为与字符串开头或空格后的位置匹配的(?&lt;!\S)。如果必须排除起始位置,(?&lt;=\s) 可能会更好。
【解决方案2】:

我们可以使用extract 将字符捕获为一个组 ((..))。把那些不需要的字符放在括号外

library(tidyverse)
data.frame(x = c("Hans-Peter Wurst -My Gosh", 
               "What is -wrong here -Do not worry")) %>%
     extract(x, into = c("one", "two"), "(.*) -([^-]+)$")
#                 one          two
#1    Hans-Peter Wurst      My Gosh
#2 What is -wrong here Do not worry

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-16
    • 2017-08-31
    • 1970-01-01
    • 2021-08-18
    • 2019-10-13
    • 1970-01-01
    • 1970-01-01
    • 2019-10-14
    相关资源
    最近更新 更多