R erhält Teilstrings und reguläre Ausdrücke?

7

Ich habe eine Reihe von Strings, die Dateinamen sind. Ich möchte alle Zeichen nach dem # Symbol aber vor der Dateiendung extrahieren. Einer der Dateinamen lautet beispielsweise:

%Vor%

Ich möchte die Zeichenfolge you

zurückgeben

Hier ist mein Code:

%Vor%

Ich habe online gelesen, dass grep den Index zurückgeben soll, wo der erste Parameter auftritt (in diesem Fall das Symbol #). Also, ich habe erwartet, dass das oben genannte funktioniert, aber das tut es nicht.

Oder wie würde ich einen regulären Ausdruck verwenden, um diese Zeichenfolge zu extrahieren? Was passiert auch, wenn die Zeichenfolge kein # -Symbol hat? Würde die Funktion einen speziellen Wert wie -1 zurückgeben?

    
CodeKingPlusPlus 15.03.2013, 00:40
quelle

5 Antworten

10

Hier ist eine One-Liner-Lösung

%Vor%

Ausgabe:

%Vor%

Um den Code zu erklären, vergleicht er alles bis # und extrahiert dann alle Wort -Zeichen bis . , so dass die endgültige Ausgabe die dazwischenliegende Zeichenkette ist, die du bist suchen.

Bearbeiten :

Die obige Lösung stimmt den Dateinamen bis zur letzten . überein, d. h. dem Dateinamen dürfen mehrere Punkte zugewiesen werden. Wenn Sie den Namen bis zum ersten . extrahieren möchten, können Sie stattdessen den Regex .*\#(\w*)\..* verwenden.

    
iTech 15.03.2013, 00:47
quelle
6

strapplyc Um das Wort unmittelbar nach # zu extrahieren, versuchen Sie es mit strapplyc im Paket gsubfn :

%Vor%

oder das ermöglicht, dass der Dateiname Punkte enthält:

%Vor%

file_path_sans_ext Ein weiterer dateinamenorientierter Ansatz mit dem tools-Paket (das mit R gebündelt ist, sodass keine zusätzlichen Pakete installiert werden müssen) ist wie folgt:

%Vor%

HINZUGEFÜGT: zusätzliche Lösungen

    
G. Grothendieck 15.03.2013 00:51
quelle
4

Sie können gsub verwenden. Vorteil davon ist, dass Sie mehrere . s bis zum letzten anpassen können.

%Vor%     
Chinmay Patil 15.03.2013 00:49
quelle
2

grep gibt den Index als Item Numbers zurück, nicht als Zeichenplatzierung (HelloWorld # you.txt hat nur einen Gegenstand, also sollte er 1 zurückgeben).

Sie möchten stattdessen regexpr , es zählt Zeichen statt Elemente.

%Vor%     
Señor O 15.03.2013 00:44
quelle
2

Diese Lösung ist einfach für diejenigen, die keine Regex lernen möchten, aber nicht mit der Absicht des Posters übereinstimmen (mehr für zukünftige Suchende). Dieser Ansatz deckt den Fall ab, in dem Sie keine # haben, da die Funktion character(0) zurückgibt.

%Vor%

Erträge:

%Vor%

Obwohl ich denke, dass es einen Fehler im Label gibt, aber nicht die tatsächlichen Rückgabewerte.

BEARBEITEN: Dies ist in der Tat ein Fehler, der in der Entwicklungsversion behoben wurde. Ausgabe mit devel. Ver .:

%Vor%     
Tyler Rinker 15.03.2013 01:56
quelle

Tags und Links