任务是使用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)"
必须保持不变,因为它不会重复
答案 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)"