【问题标题】:How to extract characters from strings using a common preceding pattern?如何使用常见的前置模式从字符串中提取字符?
【发布时间】:2018-05-15 04:39:39
【问题描述】:

我正在尝试使用 sub 函数将 Parcel Number 与凌乱的字符串变量隔离开来。包裹号码在字符串中由前面的“ParNum”标识:所需号码周围的字符各不相同,但它们遵循这两个示例的一般形式。

string1 <- "Legal Description:  PrpId:0511552031 ParNum:0511552031 CC:05 T:7 R:8"
string2 <- "Legal Description:  Rmrk:PT OF PrpId:0511552031 ParNum:0511552031 CC:05 T:7 R:8"

悲惨失败的努力:

> sub("[^:]*:)*[^:]*:", "", string1)
[1] "0511552031 ParNum:0511552031 CC:05 T:7 R:8"

想要的结果:

0511552031

【问题讨论】:

    标签: r regex substring


    【解决方案1】:

    尝试对sub 使用以下模式:

    .*ParNum:([^[:blank:]]*).*
    

    这匹配ParNum:,然后捕获ParNum: 后面的任何非空格/制表符。然后将捕获的号码作为\\1 在第一个捕获组中提供。

    代码sn-p:

    string1 <- "Legal Description:  PrpId:0511552031 ParNum:0511552031 CC:05 T:7 R:8"
    sub(".*ParNum:([^[:blank:]]*).*", "\\1", string1)
    [1] "0511552031"
    

    Demo

    【讨论】:

      【解决方案2】:

      我发现使用来自tidyversestringr 包更容易做到这一点。 (事实上​​,像这样的问题首先促使我安装stringr

      library(stringr)
      
      string1 <- "Legal Description:  PrpId:0511552031 ParNum:0511552031 CC:05 T:7 R:8"
      string2 <- "Legal Description:  Rmrk:PT OF PrpId:0511552031 ParNum:0511552031 CC:05 T:7 R:8"
      
      str_extract(string1, "(?<=ParNum:)[^[:blank:]]*")
      # [1] "0511552031"
      

      另外,str_extractsub 是矢量化的,因此以下工作

      strings <- c(string1, string2)
      str_extract(strings, "(?<=ParNum:)[^[:blank:]]*")
      # [1] "0511552031" "0511552031"
      sub(".*ParNum:([^[:blank:]]*).*", "\\1", strings)
      # [1] "0511552031" "0511552031"
      

      模式(?&lt;=) 是用于后视的正则表达式。这个site 有更多关于环视的信息。

      【讨论】:

        猜你喜欢
        • 2011-10-08
        • 1970-01-01
        • 2012-07-16
        • 2020-07-12
        • 2023-04-04
        • 1970-01-01
        • 1970-01-01
        • 2017-03-09
        • 2022-01-23
        相关资源
        最近更新 更多