gpt4 book ai didi

r - 使用 R 从文本中提取重叠的类似年份的部分

转载 作者:行者123 更新时间:2023-12-04 09:34:43 25 4
gpt4 key购买 nike

我正在尝试使用 R 从具有不同模式的文本中提取所有类似年份的短语。
我想捕捉以下所有模式:[Nothing OR non-digit][Year-like looking part][Nothing OR non-digit]例如:"1987-1998x2002"应该给 "1987-", "-1998x", "x2002"但是我的代码无法捕获 -1985x:

try <- "1987-1985x2002"
regmatches(try, gregexpr("((^|\\D)1(6|7|8|9)\\d\\d($|\\D))|((^|\\D)20(0|1|2)\\d($|\\D))", try))

[[1]]
[1] "1987-" "x2002"
我也不明白为什么匹配短语依赖于匹配较早的短语。例如,一旦我删除了上述示例的第一个字符,就会得到完全不同的结果。
try <- "987-1985x2002"
regmatches(try, gregexpr("((^|\\D)1(6|7|8|9)\\d\\d($|\\D))|((^|\\D)20(0|1|2)\\d($|\\D))", try))
[[1]]
[1] "-1985x"
我想要它捕获
"-1985x", "x2002"
就好像 gregexpr 函数在达到匹配后删除剩余搜索的整个短语一样。

最佳答案

您的模式包含 (^|\D)开始时的模式和 ($|\D)每个匹配选项末尾的模式。这些是 capturing groups消耗文本,即将匹配的文本添加到整体匹配并推进正则表达式索引。自 1987-是第一场比赛,-已消耗且不可用于下一场比赛,因此下一场比赛发生是 x2002 .
您想在内部使用单个捕获组的正向前瞻:

try <- "1987-1985x2002"
res <- stringr::str_match_all(try, "(?=((?:\\D|^)(?:1[6-9]\\d{2}|20[0-2]\\d)(?:\\D|$)))")
lapply(res, function(x) x[,-1])
输出:
[1] "1987-"  "-1985x" "x2002" 
R demo online
正则表达式详情
  • (?= - 一个积极的展望:
  • ( - 开始捕获组:
  • (?:\D|^) - 非数字字符或字符串开头
  • (?: - 非捕获组的开始:
  • 1[6-9]\d{2} - 1 , 一个从 6 到 9 的数字,然后是任意两位数字
  • | - 或
  • 20[0-2]\d - 20 , 从 0 到 2 的数字,然后是任意一位数字

  • ) - 非捕获组结束
  • (?:\D|$) - 非数字字符或字符串结尾

  • ) - 捕获组 #1 结束

  • ) - 正向前瞻结束。
  • 关于r - 使用 R 从文本中提取重叠的类似年份的部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62643402/

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