2016-08-02 8 views
1

Ich verwende reguläre Ausdrücke in R, um Zeichenfolgen aus einer Variablen zu extrahieren. Die Variable enthält verschiedene Werte, die wie folgt aussehen:Regulärer Ausdruck: Mehrere Wörter zusammenpassen

MEDIUM/REGULAR Schrittlänge

XX LARGE/SHORT Schrittlänge

SMALL/32" INSM

X LARGE/30" INSM

I müssen zwei Dinge erfassen: den Wert vor dem / als Ganzes (SMALL, XX LARGE) und die Zeichenkette (alphabetisch oder numerisch) danach. Ich möchte nicht den " INSM oder den INSEAM Teil.

Der reguläre Ausdruck für die ersten beiden, die ich verwende, ist ([A-Z]\w+) \/([A-Z]\w+) INSEAM und für die letzten zwei verwende ich ([A-Z]\w+) \/([0-9][0-9])[" INSM]. Der Teil ([A-Z]\w+) erfasst nur ein Wort, also funktioniert es gut für MEDIUM und SMALL, aber für X LARGE, XX LARGE etc. fehlgeschlagen. Gibt es eine Möglichkeit, es zu ändern, um zwei Vorkommen von Wort vor dem / Zeichen zu erfassen? Oder gibt es einen besseren Weg?

Vielen Dank im Voraus!

+1

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

+0

Danke, Wiktor, aber es fängt auch den INSM/INSEAM-Teil ein. Ich habe die Frage bearbeitet, um das zu reflektieren. – gagandeep91

+0

Also, noch einfacher [' (\ w + (?: \ w +)?) * \/* (\ w +) '] (https://regex101.com/r/zA3bA8/3) könnte das tun? –

Antwort

1

Es scheint, Sie

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

Sehen verwenden regex demo

Muster Details:

  • (\w+(?: \w+)?) - die Gruppe 1 die Erfassung eines oder mehrere Wort Zeichen gefolgt mit einer optionalen Sequenz ein Leerzeichen + ein oder mehrere Wortzeichen
  • */ * - ein / mit 0+ Räumen eingeschlossen
  • (\w+) - Gruppe 2 1 oder mehr Wort Zeichen

R Code mit stringr Erfassung:

> 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

Aus Ihrer Beschreibung, Wiktor regex fehl am "XX LARGE/SHORT" aufgrund des zusätzlichen Platzes. Es ist sicherer, alles vor dem Schrägstrich als Gruppe zu erfassen:

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