【问题标题】:Regex using back references in R在 R 中使用反向引用的正则表达式
【发布时间】:2021-11-23 09:19:42
【问题描述】:

我在 https://regex101.com/r/R8ObNk/1 (^[^\\]*)\\t([^\\]*)\\t([^\\]*)\\t([^\\]*)\\t([^\\]*)(.*) 中编写了正则表达式,并反向引用了捕获组 5 或“\5”。

由于某种原因,当我尝试使用上面使用 gsub 在 R 中编写的正则表达式时,我没有返回正确的数据。

这是我试图反向引用的第一行数据的 dput:

structure(list(value = "19-22\t\t4\tP,G\tDOB_TT\t\tTime of Birth\t\t126\t \t0000-2359 Time of Birth"), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, -1L))

这是上面一行的 gsub:gsub(pattern = "(^[^\\]*)\\t([^\\]*)\\t([^\\]*)\\t([^\\]*)\\t([^\\]*)(.*)", replacement = "\\5", x = a$value)。我知道您在使用 R 中的正则表达式时应该添加另一个“\”,但这仍然不起作用。

gsub 的预期结果应该是“DOB_TT”或第 5 个捕获组

【问题讨论】:

标签: r regex gsub


【解决方案1】:

在这种情况下,您实际上不需要正则表达式,因为您的数据是结构化的:

parsed <- read.delim(text=a$value, header=FALSE)
parsed$V5
# [1] "DOB_TT"

【讨论】:

    【解决方案2】:

    您需要小心使用转义字符。请注意,R 在网站无法理解的字符串中使用了额外的 ""。当你看到像

    这样的字符串时
    x <- "a\tb"
    

    在 R 中,字符串中没有斜杠。 \t 是制表符的转义。所以nchar(x) 返回 3,而不是 4,因为这两个值一起构成一个制表符。因此,鉴于您的数据,您真正想要的是

    gsub(pattern = "(^[^\t]*)\t([^\t]*)\t([^\t]*)\t([^\t]*)\t([^\t]*)(.*)",
      replacement = "\\5", x = a$value)
    

    制表符不需要额外的\,因为制表符在正则表达式中并不特殊。它们只是普通字符。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-01
      • 2011-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多