用于替换列表分隔符和字符串结尾的可变长度负向后搜索

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用于替换列表分隔符和字符串结尾的可变长度负向后搜索相关的知识,希望对你有一定的参考价值。

我希望在缺少值的字符串(包括最后一个)中丢失索引的值之后插入索引。

s <- "Dee, DP(Dee, D. P.)[1];Uppala, SM(Uppala, S. M.);Simmons, AJ(Simmons, A. J.);Kobayashi, S(Kobayashi, S.)[2];Andrae, U(Andrae, U.)"
gsub("(?<!\\[\\d\\])(;|$)", "\\[0\\]\\2", s, perl=TRUE)

此代码使我缺少分号:

"Dee, DP(Dee, D. P.)[1];Uppala, SM(Uppala, S. M.)[0]Simmons, AJ(Simmons, A. J.)[0]Kobayashi, S(Kobayashi, S.)[2];Andrae, U(Andrae, U.)[0]"

代码类似地处理最后一个值已经具有索引的情况:

s <- "Dee, DP(Dee, D. P.)[1];Uppala, SM(Uppala, S. M.);Simmons, AJ(Simmons, A. J.);Kobayashi, S(Kobayashi, S.)[2];Andrae, U(Andrae, U.)[3]"

这次,给予(分号仍然丢失):

"Dee, DP(Dee, D. P.)[1];Uppala, SM(Uppala, S. M.)[0]Simmons, AJ(Simmons, A. J.)[0]Kobayashi, S(Kobayashi, S.)[2];Andrae, U(Andrae, U.)[3]"

我需要返回缺少的分号,例如在第一种情况下:

"Dee, DP(Dee, D. P.)[1];Uppala, SM(Uppala, S. M.)[0];Simmons, AJ(Simmons, A. J.)[0];Kobayashi, S(Kobayashi, S.)[2];Andrae, U(Andrae, U.)[0]"

此外,我还希望代码也处理超过一个数字的索引,即10、100等(可变长度),例如:

s <- "Dee, DP(Dee, D. P.)[10];Uppala, SM(Uppala, S. M.);Simmons, AJ(Simmons, A. J.);Kobayashi, S(Kobayashi, S.)[2];Andrae, U(Andrae, U.)"

s <- "Dee, DP(Dee, D. P.)[10];Uppala, SM(Uppala, S. M.);Simmons, AJ(Simmons, A. J.);Kobayashi, S(Kobayashi, S.)[2];Andrae, U(Andrae, U.)[3]"
答案

在您的替换模式中,\2表示不存在的#2组。 (?<!...)是一个否定的回溯方式,与捕获组不同,它不强制正则表达式引擎为其匹配值分配任何特殊的内存缓冲区。

您必须使用\1,而不是\2

现在,要解决后面的可变宽度模式,您可以使用带有SKIP-FAIL动词的PCRE模式:

gsub("\\[\\d+](?:;|$)(*SKIP)(*F)|(;|$)", "[0]\\1", s, perl=TRUE)

请参见regex demoR demo online

图案详细信息

  • \[\d+](?:;|$)(*SKIP)(*F)-[,1个以上的数字,],然后是;或字符串末尾; (*SKIP)(*F)从总的匹配内存缓冲区中删除此匹配的文本,然后从失败的位置继续搜索正则表达式模式
  • |-或
  • [(;|$)-组1(替换模式中的\1):;或字符串的结尾。

以上是关于用于替换列表分隔符和字符串结尾的可变长度负向后搜索的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript 中的负向后等价

JavaScript 中的负向后等价

使用 Oracle SQL 将可变长度分隔字符串拆分为列

正则表达式,不匹配多个长度不等字符串

Python爬虫编程思想(35):用正则表达式搜索替换和分隔字符串

搜索以可变整数结尾的子字符串