2016-08-02 451 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"