我在R中使用正则表达式从变量中提取字符串。该变量包含不同的值,如:
MEDIUM / REGULAR INSEAM
XX LARGE / SHORT INSEAM
小/ 32" INSM
X LARGE / 30" INSM
我必须捕获两件事:整个/
之前的值(SMALL,XX LARGE)和之后的字符串(字母或数字)。我不想要" INSM
或INSEAM
部分。
我使用的前两个正则表达式是([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之前的两个单词出现字符?或者有更好的方法吗?
提前致谢!
答案 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"