2016-09-29 5 views
3

ich einen Vektor a haben wie folgt:benötigen regulären Ausdruck Logik

a <- c("Rs. 360 Rs. 540 [-33% ]", "Rs. 213 Rs. 250 [-15% ]", "Rs. 430 Rs. 1030 [-58% ]") 

Benötigen Sie wie unten beantworten:

a sollte Rs.360, Rs.213, Rs.430 haben

ich verwendet habe:

a <- gsub(" Rs*", "", a) 
+1

'substr (a, 1, 7)' oder um den Raum 'gsub ("^(Rs.) (\\ d {3}). + "," \\ 1 \\ 2 " a) ' – Cath

+0

Ist' Rs.' immer eine feste Zeichenfolge am Anfang? Gibt es immer 3-stellige Zahlen danach? –

Antwort

3

Sie können eine Regex mit Capturing-Gruppen verwenden, die die Teile, die Sie benötigen, und Backreferences in der Ersetzung verwenden Zement Muster Sie können sie zurück in das Ergebnis ein:

sub("^\\s*(Rs\\.)\\s*(\\d+).*", "\\1\\2", a) 

anzeigen regex demo

die Regex Spiele:

  • ^ - Beginn der Zeichenfolge
  • \\s* - null oder mehr Leerzeichen
  • (Rs\\.) - Gruppe 1 Erfassung Rs.
  • Sequenz
  • \\s* - 0+ Leerzeichen
  • (\\d+) - Gruppe 2 caprturing 1 oder mehr Ziffern
  • .* - der Rest der Schnur an ihrem Ende

getesteten Code:

> a <- c("Rs. 360 Rs. 540 [-33% ]", "Rs. 213 Rs. 250 [-15% ]", "Rs. 430 Rs. 1030 [-58% ]") 
> sub("^\\s*(Rs\\.)\\s*(\\d+).*", "\\1\\2", a) 
[1] "Rs.360" "Rs.213" "Rs.430" 

Aktualisieren

Verwenden Sie für einen Eingang wie a <- c(" 360 540", " 213 250")sub("^\\D*(\\d+).*", "\\1", a).

> a <- c(" 360 540", " 213 250") 
> sub("^\\D*(\\d+).*", "\\1", a) 
[1] "360" "213" 

Die ^\\D*(\\d+).* Matches jede Menge an nicht-stellige Symbole am Anfang des Strings, fangen dann 1+ Ziffern in Gruppe 1, und dann passen .* den Rest des Strings.

+1

dies funktionierte nicht für mich, da am Anfang mehr Platz war..ich habe andere Dinge entfernt..so sieht der Vektor aus wie ein <- ("360 540", "213 250") .. ich brauche 360 ​​und 213. ..note gibt es Platz vor 360 und 213 (also am Anfang) .. also müssen Sie alles nach dem zweiten Leerzeichen löschen .. – Nitin

+0

Also, 'Rs.' ist optional? Ich habe den ursprünglichen Vorschlag geändert und eine Lösung für die neuen Zeichenfolgen hinzugefügt, die Sie im obigen Kommentar angegeben haben. –

5

Wie ich im Kommentar gesagt habe, können Sie substr verwenden, um den Anfang der Zeichenfolge zu extrahieren, wenn Sie immer das gleiche Muster (die gleiche Anzahl an Ziffern) haben. Sie können weiter den Raum zu unterdrücken, wenn Sie wollen:

substr(a, 1, 7) 
[1] "Rs. 360" "Rs. 213" "Rs. 430" 
sub(" ", "", substr(a, 1, 7)) 
[1] "Rs.360" "Rs.213" "Rs.430" 

Oder Sie können erfassen das Muster, das Sie in der Zeichenfolge wollen und mit nur, dass eine andere Zeichenfolge bilden:

gsub("^[A-Za-z.]{3} (\\d{3}).+", "Rs.\\1", a) 
[1] "Rs.360" "Rs.213" "Rs.430" 

hier nur Sie erfassen die 3 Ziffern und setzen explizit die Rs. zurück.

Oder Sie können „löschen“ alles, was Sie nicht wollen: den Raum und alles, was nach dem Muster kommt Sie behalten möchten:

gsub("(\\s)|([A-Za-z0-9. ]{8}\\s\\[-*\\d+%\\s*\\])", "", a) 
[1] "Rs.360" "Rs.213" "Rs.430" 

Hier geben Sie Ihnen den Raum zu unterdrücken wollen (\\s) und/oder 8 Zeichen, die entweder alphanumerisch oder ein Punkt oder ein Leerzeichen sind, gefolgt von einem Leerzeichen, einer öffnenden Klammer, nichts oder einem Minuszeichen, mehr als einer Ziffer, einem% -Zeichen, nichts oder einem Leerzeichen und endlich eine schließende Klammer.