gpt4 book ai didi

r - 在 R 中用正则表达式拆分字符串

转载 作者:行者123 更新时间:2023-12-04 14:05:26 28 4
gpt4 key购买 nike

我正在尝试根据特定模式拆分字符串。我的数据嵌套在花括号中。我想要做的是在双花括号处拆分字符串。我已经想出如何在数据框中使用“单独”来执行此操作,但为了将来引用,我很想知道为什么这不起作用。

我在下面提供了一个关于单个字符串的示例:

pattern_test<-"[^\\}{2,2}]*\\}{2,2}"
teststring <- "{the {dog} is {hot}},{the {cat} is {lazy}}"
tmp<-unlist(str_extract_all(teststring, pattern_test))
tmp

tmp 的计算结果为 ("hot}}", "lazy}}")。

换句话说,我在“pattern_test”中尝试做的是定义一个包含所有不完全是“}}”的字符的类:[^\\}{2,2}] 并在该类中找到尽可能多的字符:*,后跟“}}”(方括号外:\\}{2,2})。我怀疑我犯了一个根本错误,但我在网上找到的大多数例子都没有帮助我弄清楚错误是什么。我想要 tmp 评估的是:

(“{dog} 是{hot}}”,“,{cat} 是{lazy}}”)。为什么子串在开括号处被截断?

最佳答案

问题是您不能匹配任何文本,只能匹配具有否定字符类的特定多字符子字符串,因为字符类旨在将单个字符匹配为单独的字符,而不是序列 个字符。

另一个问题是您正在尝试匹配递归模式,而 stringr/stringi 包正在使用不支持正则表达式递归的 ICU 正则表达式库。

要匹配你想要的,你只能在 R 中使用 PCRE 正则表达式库:

pattern_test<-"\\{(?:[^{}]++|(?R))*}"
teststring <- "{the {dog} is {hot}},{the {cat} is {lazy}}"
unlist(regmatches(teststring, gregexpr(pattern_test, teststring, perl=TRUE)))
## => [1] "{the {dog} is {hot}}" "{the {cat} is {lazy}}"

参见 R demo online .即:

  • \{ - 匹配一个 {
  • (?:[^{}]++|(?R))* - 除 { 之外的一个或多个字符出现零次或多次>} 或整个正则表达式模式(递归)
  • } - } 字符。

关于r - 在 R 中用正则表达式拆分字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68716906/

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