【问题标题】:How do I extract text elements between \t and \如何提取 \t 和 \ 之间的文本元素
【发布时间】:2021-02-21 20:29:17
【问题描述】:

我正在处理一些 txt 格式的非常混乱的数据,并且遇到了一个问题,我希望将特定数据填充到变量中,但我很难提取它。一个简单的例子来说明问题。我想提取一个元代码:xxxx,其中 xxxx 是取决于元代码的任何随机数,在这种情况下为 1234。在检查这个 txt 文件时,我看到在查看我加载的文件时字符串包含以下内容:

"\"\t\tMETACODE:\t\t\t1234\""

现在我想提取 1234 或 xxxx,因为我有几个 txt 文件。我尝试使用基于另一个 stackoverflow 示例的 stringr,但它没有 \t 和 .我试过了

library(stringr)
metacode <- str_match(textfile, "METACODE:\t\t\t\\s*(.*?)\\")

其中 textfile 是包含我用 readlines 读入的文本的变量。我收到以下错误:

Error in stri_match_first_regex(string, pattern, opts_regex = opts(pattern)) : 
  Unrecognized backslash escape sequence in pattern. (U_REGEX_BAD_ESCAPE_SEQUENCE)

处理 \t, \n, 等有什么好主意吗?一个简单的例子将不胜感激。

【问题讨论】:

    标签: r regex string text stringr


    【解决方案1】:

    匹配数字而不是搜索反斜杠:

    library(stringr)
    textfile <- "\"\t\tMETACODE:\t\t\t1234\""
    metacode <- str_match(textfile, "METACODE:\t\t\t\\s*(\\d+)")
    metacode[,2]
    

    结果[1] "1234"

    proof

    表达式解释

    --------------------------------------------------------------------------------
      METACODE:                'METACODE:'
    --------------------------------------------------------------------------------
      \t                       '\t' (tab)
    --------------------------------------------------------------------------------
      \t                       '\t' (tab)
    --------------------------------------------------------------------------------
      \t                       '\t' (tab)
    --------------------------------------------------------------------------------
      \s*                      whitespace (\n, \r, \t, \f, and " ") (0 or
                               more times (matching the most amount
                               possible))
    --------------------------------------------------------------------------------
      (                        group and capture to \1:
    --------------------------------------------------------------------------------
        \d+                      digits (0-9) (1 or more times (matching
                                 the most amount possible))
    --------------------------------------------------------------------------------
      )                        end of \1
    

    【讨论】:

    • 出于好奇,您有什么理由明确包含三个选项卡而不是让"\\s*" 处理它?此外,让空白匹配惰性而不是贪婪可能更安全(如果没有更大的数据样本就很难知道)。
    • @Andrew 我知道 OP 需要提取的数字之前必须有 3 个标签。当然,如果对标签没有严格要求,\\s* 就足够了。
    猜你喜欢
    • 2018-02-07
    • 2013-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多