2017-03-02 41 views
1

正則表達式大師,正則表達式組和總和

我不經常使用正則表達式,對不起,如果這是一個新手問題。

我有這些樣本字符串:

  1. 「我有10輛汽車& 12卡車」
  2. 「我們擁有2輛汽車& 1輛卡車」
  3. 「2輛汽車& 2卡車。」
  4. 「1號車」
  5. 「1輛卡車」
  6. 「2輛」
  7. 「2輛卡車」
  8. 「我們有1個皮卡。另外2輛& 1輛卡車。」
  9. 「買了3個轎車另有10輛卡車& 10輛」

我需要這樣的輸出:

car truck 
1. 10 12 
2. 2 1 
3. 2 2 
4. 1 0 
5. 0 1 
6. 2 0 
7. 0 2 
8. 2 2 (Ford pickup is a type of truck) 
9. 13 10 (sedans is a type of car) 

的數字可以是任意整數。它可以在一個正則表達式中完成嗎? 如果沒有,就我而言,可以做多次傳球。語言並不重要,我對正則表達式更感興趣。

在此先感謝。

+2

正則表達式阿龍e不能這樣做。你使用哪種編程語言? –

+1

你必須使用類似'(\ d +)(\ w +)'的東西,並編寫一些代碼來判斷它是汽車還是卡車,然後進行計算。 –

+0

正則表達式不能「創建」字符。我特別指的是在你想要的輸出中輸入「0」作爲「未找到」數字。你需要一些代碼。 – Bohemian

回答

1

與編程語言相結合,你可以這樣做:

(?:(\d+)\s+(?:\bsedans?\b|\bcars?\b))|(?:(\d+)\s+(?:\bpickups?\b|\btrucks?\b)) 

Demo

這裏是一個Perl腳本演示:

$ txt='"I have 10 cars & 12 trucks" 
> "We own 2 cars & 1 truck" 
> "2 cars & 2 trucks." 
> "1 car" 
> "1 truck" 
> "2 cars" 
> "2 trucks" 
> "We have 1 pickup . Another 2 cars & 1 truck." 
> "Bought 3 sedans. Another 10 trucks & 10 cars"' 

$ echo "$txt" | perl -lne 'BEGIN{print "\tCars\tTrucks"} 
         $c+=$1 while(/(?:(\d+)\s+(?:\bsedans?\b|\bcars?\b))/g); 
         $t+=$1 while(/(?:(\d+)\s+(?:\bpickups?\b|\btrucks?\b))/g); 
         printf "%i\t%3i\t%10i\t%s\n", ++$i,$c,$t, $_; 
         $c=0; $t=0;' 

打印:

Cars Trucks 
1 10   12 "I have 10 cars & 12 trucks" 
2  2   1 "We own 2 cars & 1 truck" 
3  2   2 "2 cars & 2 trucks." 
4  1   0 "1 car" 
5  0   1 "1 truck" 
6  2   0 "2 cars" 
7  0   2 "2 trucks" 
8  2   2 "We have 1 pickup . Another 2 cars & 1 truck." 
9 13   10 "Bought 3 sedans. Another 10 trucks & 10 cars" 
+0

偉大的答案,你去超越。我實際上在R中這樣做,我可以修改表達式並應用到我的數據集的其餘部分。幹得好,謝謝你! – Perceptron