r - gsub,先行后向

标签 r regex

我有一个包含以下内容的字符串 vector :

Number of source1.2_SPNB.txt
Number of source1.1_SPNB.txt
Number of source1.3_SPNB.txt

我需要在一个新 vector 中提取“source1.1”,“source1.2”和“source1.3”。

this之后,我尝试了:
gsub("(?<=of )(.*)(?=_)", "\\1", string.vector)

但我得到一个错误:

invalid regular expression '(?<=of )(.*)(?=_)', reason 'Invalid regexp'



然后,我尝试:
gsub("(?<=of )(.*)(?=_)", "\\1", string.vector, perl = TRUE)

但是它返回了完全相同的字符串 vector 。

我究竟做错了什么?

最佳答案

有几个问题:

  • perl = TRUE需要使用lookahead / lookbehind
  • ,即使我们使用正则表达式所做的只是用其自身替换所需的子字符串-我们想要做的是匹配整个字符串(而不是使用零宽度的lookahead / lookbehind),然后将整个字符串替换为只是与捕获组匹配的部分。
  • 大概只需要一个替换,所以应该使用
  • 而不是sub

    解决这些问题,我们得到:
    sub(".*(source.*?)_.*", "\\1", string.vector)
    

    关于r - gsub,先行后向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47792032/

    相关文章:

    r - 在 Travis 上构建 R 包,如何不将警告视为错误?

    regex - 使用 Julia 和 Regex 从文件中收集字符串并写入输出文件

    python - 很好的正则表达式,用于清理 Python 中的空格分隔数字

    regex - 使用水槽拦截器逐行过滤文件

    r - 将文献引用放入 Rmd 的表格中

    r - R 中的数组运算

    r - 将函数应用于数据框的子集

    R似乎忽略了.Rprofile的最后一行?

    c# - 用户名的正则表达式?

    mysql - 字符更改MySQL后SQL提取数据