2016-08-02 88 views
1

我在R中使用正則表達式從變量中提取字符串。變量包含看起來像不同的值:正則表達式:匹配多個單詞

MEDIUM/REGULAR INSEAM

XX LARGE/SHORT INSEAM

SMALL/32" INSM

X LARGE/30" INSM

我必須捕獲兩件事:整體(小,XX大)/之前的值和它後面的字符串(字母或數字)。我不想要" INSMINSEAM部分。

正在使用的前兩個正則表達式是([A-Z]\w+) \/([A-Z]\w+) INSEAM,最後兩個正在使用([A-Z]\w+) \/([0-9][0-9])[" INSM]。 部分([A-Z]\w+)只能捕獲一個單詞,所以對於MEDIUM和SMALL可以正常工作,但對於X LARGE,XX LARGE等失敗。是否有方法可以修改它以在/字符之前捕獲兩個單詞的發生?還是有更好的方法來做到這一點?

在此先感謝!

+1

嘗試['(W + \ w +(?:\)?)* \/*(\ w +「(?:\ w +)? )'](https://regex101.com/r/zA3bA8/1) –

+0

感謝Wiktor,但它也捕獲INSM/INSEAM部分我已經編輯了這個問題來反映這一點 – gagandeep91

+0

所以,甚至更簡單['(\ w +(?: \ w +)?)* \/*(\ w +)'](https://regex101.com/r/zA3bA8/3)可能會做什麼? –

回答

1

看來你可以使用

(\w+(?: \w+)?) */ *(\w+) 

regex demo

圖案的詳細資料

  • (\w+(?: \w+)?) - 第1組捕獲一個或多個單詞字符後跟用的可選序列一個空格+一個或多個單詞字符
  • */ * - 一個封閉與0+空間
  • (\w+)/ - 第2組捕獲1個或多個單詞字符

R代碼裏面有stringr

> library(stringr) 
> v <- c("MEDIUM /REGULAR INSEAM", "XX LARGE /SHORT INSEAM", "SMALL /32\" INSM", "X LARGE /30\" INSM") 
> str_match(v, "(\\w+(?: \\w+)?) */ *(\\w+)") 
    [,1]    [,2]  [,3]  
[1,] "MEDIUM /REGULAR" "MEDIUM" "REGULAR" 
[2,] "XX LARGE /SHORT" "XX LARGE" "SHORT" 
[3,] "SMALL /32"  "SMALL" "32"  
[4,] "X LARGE /30"  "X LARGE" "30"  
2

從你的描述,Wiktor的的正則表達式將失敗由於有額外的空間,因此可以使用"XX LARGE/SHORT"。它是安全的正斜線作爲組之前捕捉到一切:

sub("^(.*/\\w+).*", "\\1", x) 
#[1] "MEDIUM /REGULAR" "XX LARGE /SHORT" "SMALL /32" "X LARGE /30"