2016-08-13 59 views
0

我想提取之間的文本 「之一:」「之二:」之間「之二:」 和「三:」 在字符串中S1「之一:BLA 1 two:bla2 three:bla3「。然而「two:bla2」不一定出現在字符串s2中。因此,如果它是s2「one:bla 1 three:bla3」它也應該工作。如何使用帶有可選模式的正則表達式提取文本?

我已經想出以下R-代碼,但我嘗試與各地「之二:......」附加括號問號不起作用:

library(gsubfn) 
s1 <- "one: bla 1 two: bla2 three: bla3" 
s2 <- "one: bla 1 three: bla3" 
strapplyc(s1, "one: (.*) (two: (.*))? three: (.*)") 
strapplyc(s2, "one: (.*) (two: (.*))? three: (.*)") 
+1

什麼只是在拆分'\ W *(一個|二|三):\ W *'? –

+0

如果兩個不存在,那麼你的正則表達式要求在三個之前有兩個空格,但是在s2中只有三個空間,所以請嘗試將第二個空間放置在父項中,以便這樣做? (s2,「one:(。*)(two:(。*))?three:(bla3)」)' –

+0

@ G.Grothendieck您的建議似乎適用於s2,但不適用於S1。 – tover

回答

2

也許問題在於one:之後的.*也在消耗two:部分及其後面的文本。因此,例如您行中的匹配組將是

1: "bla 1 two: bla2" 
2: [empty] 
3: "bla3" 

您可以通過使第一個星號非貪心與問號來解決此問題。

其他一些要點:我認爲你應該把空格放在two:部分的圓括號內,否則當它不可用時,one:two:部分之間必須有兩個空格。

此外,對於小的整理,您可以使可選部分周圍的圓括號與?:不能捕捉。你只想捕獲三件事情,並且圍繞two:部分的括號只是爲了優先,所以沒有必要捕獲。

這麼幹脆你有這樣的事情:

strapplyc(s1, "one: (.*?)(?: two: (.*))? three: (bla3)") 
+0

這很有效。謝謝! – tover