2015-08-05 3 views
5

Lassen Sie mich das folgende Beispiel zur Veranschaulichung verwenden.Unerwarteter unsymmetrischer regulärer Ausdruck Verhalten von < and > in R

str = "we are friends" 

Die Hilfe doc sagt, dass

Die Symbole \ < und \> am Anfang die leere Zeichenkette übereinstimmen und Ende eines Wortes.

So wird das folgende erwartet, wo ein Leerzeichen am Ende jedes Wortes hinzugefügt wird.

gsub("\\>"," ", str) 
[1] "we are friends " 

Doch warum wird es nicht funktionieren, wenn

gsub("\\<"," ", str) 
[1] " w e a r e f r i e n d s" 

verwenden, können einige erklären, warum dies geschieht? und was muss ich tun, wenn ich einen zusätzlichen Whitespace vor jedem Wort hinzufügen möchte?

+0

Vielleicht 'gsub ('\\ b (? = \\ w)', '', str, perl = WAHR)' – akrun

+2

Noch ein Kommentar Abzocke, @akrun :) –

Antwort

1

Es ist ziemlich seltsam, aber ich denke, das documented as a warning ist:

POSIX 1003.2-Modus von gsub und gregexpr nicht korrekt mit wiederholtem Wort-Grenzen nicht funktioniert (zum Beispiel pattern = "\b"). Verwenden Sie perl = TRUE für solche Übereinstimmungen (aber das funktioniert möglicherweise nicht wie erwartet mit Nicht-ASCII-Eingaben, da die Bedeutung von 'Wort' systemabhängig ist).

So verwenden \\b(?=\\w) oder (?<!\\w)\\b mit perl=T:

str = "we are friends" 
gsub('(?<!\\w)\\b', ' ', str, perl=T) 

Siehe demo

Ausgang: [1] " we are friends".

+0

Funktioniert wie ein Charme. Könnten Sie bitte erklären, was (? wen

+0

'(?

+0

Da '\\ b' zwischen alphanumerischen und nicht-alphanumerischen Zeichen passt und somit sowohl am Anfang als auch am Ende von Wörtern übereinstimmen kann, beschränkt der Lookbehind es nur auf den Anfang von Wörtern. –