【问题标题】:Passing function to R regex-based tools将函数传递给基于 R 正则表达式的工具
【发布时间】:2020-10-18 15:36:12
【问题描述】:

这个字符串操作问题已经避开了我的最大努力。我有一个字符串,例如

eg_str="[probability space](posts/probability space.md) is ... [Sigma Field](posts/Sigma Field.md)"

我想用下划线替换 ([wildcard].md) 通配符中的所有空格。我的第一个想法是使用 gsub 或 stringr 的 str_replace_all 将适当的子字符串传递给一个简单的函数。类似的东西

convert_space_to_underscore<-function(string){
    return(str_replace(string," ","_"))
}
normal_eg_str<-gsub("\\((.+?)md\\)",paste0("(",convert_space_to_underscore("\\1"),"md)"),normal_eg_str)

normal_eg_str<-str_replace_all(document,"\\((.+?)md\\)",paste0("(",convert_space_to_underscore("\\1"),".md)"))

但是,当我运行这些时,似乎正在传递 convert_space_to_underscore 的参数,而不是输出,因为字符串返回不变(如果您在 paste0 组件中出错,说有 paste0("(",convert_space_to_underscore("\\1"),".m)"),那么字符串返回为

eg_str="[probability space](posts/probability space.m) is ... [Sigma Field](posts/Sigma Field.m)"

所以我很确定发生的事情是 str_replace_all 和 gsub 根本没有评估函数)。

有没有办法强制评估?这将是最理想的,因为它将允许正则表达式组件保持一定的可读性。但是,我也欢迎任何纯正则表达式解决方案——我的尝试都导致了贪婪的错误,无论我似乎在哪里撒?{0} 特殊字符。 (注意:会有一些匹配的子字符串有多个空格,例如[Dynklin's Pi Lambda](posts/dynklins pi lambda.md)

【问题讨论】:

    标签: r regex gsub stringr


    【解决方案1】:

    你可以使用

    library(stringr)
    eg_str <- "[probability space](posts/probability space.md) is ... [Sigma Field](posts/Sigma Field.md)"
    str_replace_all(eg_str, "\\([^()]+\\.md\\)", function(x) gsub(" ", "_", x, fixed=TRUE) )
    ## => [1] "[probability space](posts/probability_space.md) is ... [Sigma Field](posts/Sigma_Field.md)"
    

    online R demo

    注意:要用单个下划线替换一个或多个空白块,您需要在gsub:gsub("\\s+", "_", x) 中使用正则表达式。

    first regex 查找所有字符串

    • \( - 以 ( 开头
    • [^()]+ - 除了() 之外还有一个或多个字符
    • \.md - .md 字符串
    • \) - 并以 ) 结尾

    然后,匹配被传递给一个匿名函数,用_gsub(" ", "_", x, fixed=TRUE))替换每个常规空格。

    一个基本的 R 解决方案(可读性较差,但使用普通的正则表达式):

    eg_str <- "[probability space](posts/probability space.md) is ... [Sigma Field](posts/Sigma Field.md)"
    gsub("(?:\\G(?!^)|\\()[^()\\s]*\\K\\s+(?=[^()]*\\.md\\))", "_", eg_str, perl=TRUE)
    

    this R demo online。见this regex demo。详情:

    • (?:\G(?!^)|\() - 上一场比赛的结束或( char
    • [^()\s]* - 除() 和空格之外的任何 0 个或多个字符
    • \K - 匹配重置操作符,从整体匹配内存缓冲区中丢弃所有匹配的文本
    • \s+ - 一个或多个空格
    • (?=[^()]*\.md\)) - 除了() 之外,应该有零个或多个字符,紧跟在当前位置右侧的.md)

    【讨论】:

      猜你喜欢
      • 2016-08-04
      • 2014-01-10
      • 2011-06-09
      • 1970-01-01
      • 2022-11-12
      • 1970-01-01
      • 1970-01-01
      • 2021-12-31
      • 2010-11-14
      相关资源
      最近更新 更多