【问题标题】:Extract string between multiple words, using gsub使用 gsub 提取多个单词之间的字符串
【发布时间】:2017-04-04 15:26:33
【问题描述】:

我正在尝试使用 -gsub- 从 R 中的字符串中分离单词。我想提取一个可以在“(”和“(m)”(男性)或“(”和“(f)”之间找到的名称。我正在努力合并到一行代码中。

name<-c("Dr. T. (Tom) Bailey (m), UCL- Physics" , "Dr. B.K. (Barbara) Blue (f), Oxford - Political Science")

malename<-gsub(".*\\) (.*) \\(m).*", "\\1", name)
femname<-gsub(".*\\) (.*) \\(f).*", "\\1", name)

上面的代码分别给了我男性和女性的名字,但理想情况下,我想在一个变量中获取他们的姓氏。这将涉及一些 OR 函数(so (m) OR (f)),但我不知道如何合并它。

【问题讨论】:

  • 你的意思是你在找".*\\) (.*) \\([mf]\\).*"
  • gsub('(\\w+) \\([mf]\\)|.', '\\1', name)

标签: r regex gsub


【解决方案1】:

试试sub

sub("^[^)]+\\)\\s+(\\w+).*", "\\1", name)
#[1] "Bailey" "Blue"  

【讨论】:

    【解决方案2】:

    如果您需要匹配 mf,匹配它们的最佳方式是 character class(或者,在 POSIX 术语中,括号表达式):[mf]

    你的正则表达式看起来像

    ".*\\)\\s+(.*)\\s+\\([mf]\\).*"
                         ^^^^
    

    regex demo

    您可以使用带有sub 的正则表达式来确保只执行一个正则表达式匹配和替换(请参阅online demo):

    name<-c("Dr. T. (Tom) Bailey (m), UCL- Physics" , "Dr. B.K. (Barbara) Blue (f), Oxford - Political Science")
    res <- sub(".*\\)\\s+(.*)\\s+\\([mf]\\).*", "\\1", name)
    res
    ## => [1] "Bailey" "Blue"  
    

    【讨论】:

    • 非常感谢您的帮助,一切顺利。不幸的是,我现在看到有些名字没有列出性别,例如:“Dr. T. (Tim) Ford, UCL- Physics”。我可以在命令中也使用逗号吗?类似地,一些名称在性别标识符之后包括一个额外的空格,即:“Dr. T. (Tom) Bailey (m), UCL-Physics”。有什么办法可以解决这个问题吗?
    • 是的,对第一个和第二个点使用惰性匹配 (.*?) 并使用替换 (?:\([mf]\)|,): sub(".*?\\)\\s*(.*?)\\s*(?:\\([mf]\\)|,).*", "\\1", name)
    • 再次感谢,但惰性匹配似乎并没有解决 m (m ) 之后的额外空间。在此示例中,它不返回名称。 name&lt;-c("Dr. T. (Tom) Bailey (m )) 然后sub(".*?\\)\\s*(.*?)\\s*(?:\\([mf]\\)|,).*", "\\1", name) 返回一个空字符串。
    • 您的示例没有包含这种输入。要匹配这些字符串,您需要在[mf] 之后使用\s* 来“允许”0+ 个空格。点是贪婪量化还是惰性量化都没有关系。试试sub(".*?\\)\\s*(.*?)\\s*(?:\\(\\s*[mf]\\s*\\)|,).*", "\\1", name)
    • 这非常有效,你拯救了我的一天!非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-13
    • 2013-12-12
    • 2022-01-22
    • 2014-05-28
    • 1970-01-01
    • 2017-10-12
    • 2021-12-07
    相关资源
    最近更新 更多