提取在R中的字符串中重复的短语

时间:2016-05-19 08:30:14

标签: regex r string pattern-matching

任务是使用R软件从字符串中提取短语。

考虑使用一组具有相似结构的字符串:字符串以括号(开头,并以其他括号)结束,并且在它之间有几个用逗号分隔的相同短语{{ 1}},例如,。事先不知道该短语重复多少次,因此它可以是2 "(matrix,matrix,matrix)",3,4 "(matrix,matrix)"等重复。通常最多为6.如果只有一个短语,则不在(附加)括号中(例如,"(matrix,matrix,matrix,matrix,)""matrix")。

我设法通过使用:

提取一个短语
"(matrix)"

但是有一个更高级的问题:我如何检查,如果短语重复,只有重复时提取,否则保持原样?例如。如何提取
来自NAME <- "(matrix,matrix,matrix,matrix)" gsub("(\\()(.*,){1,}(.*)\\)", "\\3",NAME, perl = T) 的{​​{1}},
 来自"matrix"的{​​{1}},
来自"(matrix,matrix,matrix,matrix)"的{​​{1}}和
 来自"A B"的{​​{1}},
"(A B,A B)"必须保持不变,因为它不会重复

1 个答案:

答案 0 :(得分:3)

您可以使用

\((.+?)(?:,\1)+\)

请参阅regex demo

模式说明

  • \( - 打开圆括号
  • (.+?) - 第1组匹配换行符以外的1个或多个字符
  • (?:,\1)+ - 一个或多个,序列,然后将值捕获到Grouip 1中
  • \) - 结束圆括号。

R demo:

> s = "(matrix,matrix,matrix)"
> gsub("\\((.+?)(?:,\\1)+\\)", "\\1", s)
[1] "matrix"
> s = "(m,d,s)"
> gsub("\\((.+?)(?:,\\1)+\\)", "\\1", s)
[1] "(m,d,s)"