我正在尝试根据特定模式拆分字符串。数据嵌套在大括号内。我要做的是在双花括号处拆分字符串。我已经想出了如何用"separate"来做到这一点。在一个数据框架内,但为了将来的参考,我想知道为什么这不起作用。
我在下面提供了一个关于单个字符串的例子:
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评估("热}}","懒}}")。
换句话说,我在"pattern_test"定义一个类,它包含所有不完全是"} ":[^\}{2,2}]
的字符,并在该类:*
中查找尽可能多的字符,后面跟着"}}"(方括号外:\}{2,2}
)。我怀疑我犯了一个基本错误,但我在网上找到的大多数例子都没有帮助我弄清楚错误是什么。我想让tmp求值为:
("{{狗}是{热}}",",{{猫}是{懒惰}}")。为什么子字符串在左括号处被截断?
问题是,除了一个特定的多字符子字符串外,您不能匹配任何文本,因为字符类意味着将单个字符作为单独的字符匹配,而不是作为字符序列匹配。
另一个问题是你正在尝试匹配递归模式,stringr
/stringi
包正在使用ICU正则表达式库,不支持正则表达式中的递归。
要匹配你想要的,你只能使用PCRE regex库与R:
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的在线演示。即:
{
-匹配{
(?:[^{}]++|(?R))*
-零次或多次出现除{
和}
以外的一个或多个字符或整个正则表达式模式(递归)}
- a}
char.