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



我正在尝试根据特定模式拆分字符串。数据嵌套在大括号内。我要做的是在双花括号处拆分字符串。我已经想出了如何用"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.

最新更新