Sie könnten die Klassen verwenden [:alnum:]
und [:space:]
dafür:
sample_string <- "�+ Sample 2 string here =�{�>E�BH�P<]�{�>"
gsub("[^[:alnum:][:space:]]","",sample_string)
#> [1] "ï Sample 2 string here ïïEïBHïPïï"
Alternativ Sie können PCRE-Codes verwenden, um auf bestimmte Zeichensätze zu verweisen:
gsub("[^\\p{L}0-9\\s]","",sample_string, perl = TRUE)
#> [1] "ï Sample 2 string here ïïEïBHïPïï"
In beiden Fällen wird deutlich, dass die noch vorhandenen Buchstaben als Buchstaben gelten. Auch die EBHP-Inneren sind immer noch Buchstaben, daher ist der Zustand, in dem Sie ersetzen, nicht korrekt. Sie wollen nicht alle Buchstaben zu halten, Sie wollen einfach nur von A-Z zu halten, a-z und 0-9:
gsub("[^A-Za-z0-9 ]","",sample_string)
#> [1] " Sample 2 string here EBHP"
Dieses noch die EBHP enthält. Wenn Sie wirklich nur einen Abschnitt halten möchten, die nur Buchstaben und Zahlen enthält, sollten Sie die umgekehrte Logik verwenden: Wählen Sie, was Sie wollen und ersetzen Sie alles aber, dass die Verwendung von Rückreferenzierungen:
gsub(".*?([A-Za-z0-9 ]+)\\s.*","\\1", sample_string)
#> [1] " Sample 2 string here "
Oder, wenn Sie einen finden wollen String, auch nicht durch Leerzeichen gebunden, verwenden Sie die Wortgrenze \\b
statt:
gsub(".*?(\\b[A-Za-z0-9 ]+\\b).*","\\1", sample_string)
#> [1] "Sample 2 string here"
Was hier passiert:
.*?
passt überhaupt etwas lea (.) st 0 mal (*) aber nicht gierig (?). Dies bedeutet, dass gsub versuchen wird, die kleinste mögliche Anzahl von Stücken zu passen.
- alles zwischen
()
gespeichert wird und kann durch \\1
im Ersatz refered werden
\\b
zeigt eine Wortgrenze
- Dieses mindestens einmal folgt (+) von jedem Charakter, ist AZ, az, 0-9 oder ein Leerzeichen.Sie müssen es so machen, weil die speziellen Buchstaben zwischen der Groß- und Kleinschreibung in der Codetabelle enthalten sind. So verwendet
A-z
alle Sonderzeichen (die UTF-8 BTW sind!)
- nach dieser Sequenz, passen Sie alles mindestens Null mal, um den Rest der Zeichenfolge zu entfernen.
- die Rückreferenz
\\1
in Verbindung mit .*
in der Regex, wird sicherstellen, dass nur der erforderliche Teil in der Ausgabe bleibt.
Wollten Sie 'trimws (gsub ('[^ 0-9A-Za-z]', '',"? "+ Sample string here =? E? ½BH? P <]? (?>)) ' – akrun
' [^ A-z0-9] 'ist prägnanter @akrun. Allerdings bleibt "Sample String hier EBHP" – zacdav
'[A-z]' passt nicht nur Buchstaben. –