2014-03-03 61 views
2

在这种情况下,如何使用正则表达式查找特定模式?

(3 [97 98] 100 110 [116 117] 200)

我想选择这样的数字的话。

当数字字词在[ ]时,那么只有在[之后的字词和数字字词不在[ ]那么它们全部是。

3 97 100 110 116 200

我怎样才能让这个?

回答

5

您可以使用gsub

s <- "(3 [97 98] 100 110 [116 117] 200)" 

gsub("\\[(\\d+).*?\\]|[()]", "\\1", s) 
# [1] "3 97 100 110 116 200" 

它是如何工作的?

gsub中使用的正则表达式是

\\[(\\d+).*?\\]|[()] 

它由两个部分组成,由逻辑|)相连接。

第一部分,

\\[(\\d+).*?\\] 

匹配方括号(包括支架)之间的所有内容。正则表达式\\[[,\\]匹配,匹配]。此外,\\d+表示一位或多位数字。 .*?匹配任意数量的任何字符。 ?确保非贪婪匹配,即直到下一个]。括号表示匹配组。这里,第一个匹配组是[之后的第一个数字串。

第二部分,

[()] 

匹配括号。

每个匹配被替换为\\1,即第一匹配组。因此,方括号之间的字符串被这些括号内的第一个数字取代。由于没有匹配的组,所以括号被替换为空(空字符串)。

+0

非常感谢。你是个天才!!! – user2427306

+0

@Sven Hohenstein很好地使用正则表达式,但我可以请你翻译它并解释gsub表达式中正在做什么? –

+0

@PauloCardoso我添加了一个解释。 –

0

这可能是你要找的。

s <- "(3 [97 98] [116 117] 200)" 
regmatches(s, gregexpr("[0-9]", s)) 

我不明白你究竟编辑,但你只需要更新的正则表达式替换"[0-9]"