gpt4 book ai didi

r - 正后视后捕获,除了字符串包含 R 中的排除项

转载 作者:行者123 更新时间:2023-12-04 08:55:35 24 4
gpt4 key购买 nike

假设我有以下字符串要解析以用于 R :

PIA+1+TC_5504_00_312010_0050+50103 AB346 type 5334
PIA+1+TC_3444_00_312010_0133+0140
PIA+1+DRW/50488665600/01/000:DW
PIA+1+TC_5635_00_312019_2644+LoremIpsum
PIA+1+TC_5635_00_312010_0040+63503 AB346 type 5334
PIA+1+TC_5635_00_312018_0223+DolorSit
PIA+1+TC_5635_00_312019_2644+DolorSit
简而言之,逻辑是这样的:
  • 在正面回顾后捕获所有内容 (?<=^PIA\+\d{1}\+)
  • 不要捕获字符串包含的位置 LoremIpsumDolorSit

  • 所需的输出应如下所示:
    TC_5504_00_312010_0050+50103 AB346 type 5334
    TC_3444_00_312010_0133+0140
    DRW/50488665600/01/000:DW
    TC_5635_00_312010_0040+63503 AB346 type 5334
    到目前为止,这是我到达的地方:
    (?<=^PIA\+\d{1}\+)((?!.*LoremIpsum|DolorSit).)*$
    我是故意没有按照 R逃的还没有,但稍后会这样做。
    但不幸的是,它将捕获的最后一位数字保留到一个新组中。我在正则表达式方面的经验是有限的,我被困在如何捕获组中的整个剩余字符串。我不受这种方法的约束,另一个逻辑可能是,每当最后一个 +后跟一个字母,它应该排除捕获,但这会导致使用 PIA+1+DRW/50488665600/01/000:DW 添加场合很困难。字符串。
    我的 sample 存放在这里 regex101.com

    最佳答案

    你可以通过用一个简单的交替组替换它来完全摆脱低效的调节贪婪 token :

    (?<=^PIA\+\d\+)(?!.*(?:LoremIpsum|DolorSit)).*$
    regex demo
    详情
  • (?<= - 在当前位置左侧的正面回顾,需要
  • ^ - 字符串开头
  • PIA\+ - PIA+
  • \d - 一位数
  • \+ - 一个 +

  • ) - 回顾结束
  • (?!.*(?:LoremIpsum|DolorSit)) - 如果有零个或多个字符而不是尽可能多的换行符,则匹配失败的负前瞻,然后跟随 LoremIpsumDolorSit当前位置右侧的子字符串
  • .*$ - 其余部分。

  • R demo :
    library(stringr)
    x <- c("PIA+1+TC_5504_00_312010_0050+50103 AB346 type 5334",
    "PIA+1+TC_3444_00_312010_0133+0140",
    "PIA+1+DRW/50488665600/01/000:DW",
    "PIA+1+TC_5635_00_312019_2644+LoremIpsum",
    "PIA+1+TC_5635_00_312010_0040+63503 AB346 type 5334",
    "PIA+1+TC_5635_00_312018_0223+DolorSit",
    "PIA+1+TC_5635_00_312019_2644+DolorSit")
    str_extract(x, "(?<=^PIA\\+\\d\\+)(?!.*(?:LoremIpsum|DolorSit)).*$")
    输出:
    [1] "TC_5504_00_312010_0050+50103 AB346 type 5334"
    [2] "TC_3444_00_312010_0133+0140"
    [3] "DRW/50488665600/01/000:DW"
    [4] NA
    [5] "TC_5635_00_312010_0040+63503 AB346 type 5334"
    [6] NA
    [7] NA
    或者,您也可以使用以下方法获取匹配的字符串
    res <- sub("^PIA\\+\\d\\+(?!.*(?:LoremIpsum|DolorSit))(.*)|.*", "\\1", x, perl=TRUE)
    res[res != ""]
    this R demo .
    或者,如果您只需要 grep这些字符串:
    grep("^PIA\\+\\d\\+(?!.*(?:LoremIpsum|DolorSit))", x, perl=TRUE, value=TRUE)
    this R demo .输出:
    [1] "PIA+1+TC_5504_00_312010_0050+50103 AB346 type 5334"
    [2] "PIA+1+TC_3444_00_312010_0133+0140"
    [3] "PIA+1+DRW/50488665600/01/000:DW"
    [4] "PIA+1+TC_5635_00_312010_0040+63503 AB346 type 5334"

    关于r - 正后视后捕获,除了字符串包含 R 中的排除项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63847925/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com