正则表达式:匹配多个单词

时间:2016-08-02 20:58:50

标签: regex r

我在R中使用正则表达式从变量中提取字符串。该变量包含不同的值,如:

MEDIUM / REGULAR INSEAM

XX LARGE / SHORT INSEAM

小/ 32" INSM

X LARGE / 30" INSM

我必须捕获两件事:整个/之前的值(SMALL,XX LARGE)和之后的字符串(字母或数字)。我不想要" 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之前的两个单词出现字符?或者有更好的方法吗?

提前致谢!

2 个答案:

答案 0 :(得分:2)

根据您的描述,由于额外的空间,Wiktor的正则表达式将在"XX LARGE/SHORT"失败。在正斜杠之前捕捉所有内容更安全:

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

答案 1 :(得分:1)

似乎你可以使用

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

请参阅regex demo

模式详细信息

  • (\w+(?: \w+)?) - 第1组捕获一个或多个单词字符,后跟可选的空格序列+一个或多个单词字符
  • */ * - /用0+空格包围
  • (\w+) - 第2组捕获1个或多个字词

使用stringr的R代码:

> 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"