Ein Regex zum Entfernen von Ziffern mit Ausnahme von Wörtern, die mit # beginnen

8

Ich habe einige Zeichenfolgen, die Buchstaben, Zahlen und das Symbol '#' enthalten können.

Ich möchte Ziffern mit Ausnahme der Wörter entfernen, die mit '#' beginnen.

Hier ist ein Beispiel:

"table9 dolv5e #10n #dec10 #nov8e 23 hello"

Und die erwartete Ausgabe ist:

"table dolve #10n #dec10 #nov8e  hello"

Wie kann ich das mit Regex, Stringr oder Gsub machen?

castaa95
quelle

Antworten:

6

Wie wäre es, das Gesuchte zu erfassen und das Unerwünschte durch ein leeres (nicht erfasstes) zu ersetzen?

gsub("(#\\S+)|\\d+","\\1",x)

Siehe Demo unter regex101 oder R-Demo unter tio.run (ich habe keine Erfahrung mit R)

Meine Antwort geht davon aus, dass immer Leerzeichen dazwischen sind #foo bar #baz2. Wenn Sie so etwas haben #foo1,bar2:#baz3 4, verwenden Sie\w (Wortzeichen) anstelle von \S(kein Leerzeichen).

Wackelblase
quelle
5

Sie können die Zeichenfolge auf Leerzeichen aufteilen, Ziffern aus Token entfernen, wenn diese nicht mit '#' beginnen, und zurück einfügen:

x <- "table9 dolv5e #10n #dec10 #nov8e 23 hello"
y <- unlist(strsplit(x, ' '))
paste(ifelse(startsWith(y, '#'), y, sub('\\d+', '', y)), collapse = ' ')
# output 
[1] "table dolve #10n #dec10 #nov8e  hello"
user2474226
quelle
1

Sie verwenden gsub, um Ziffern zu entfernen, zum Beispiel:

gsub("[0-9]","","table9")
"table"

Und wir können Ihren String mit strsplit teilen:

STRING = "table9 dolv5e #10n #dec10 #nov8e 23 hello"
strsplit(STRING," ")
[[1]]
[1] "table9" "dolv5e" "#10n"   "#dec10" "#nov8e" "23"     "hello"

Wir müssen nur STRING mit gsub durchlaufen und es nur auf Elemente anwenden, die kein "#" haben.

STRING = unlist(strsplit(STRING," "))
no_hex = !grepl("#",STRING)
STRING[no_hex] = gsub("[0-9]","",STRING[no_hex])
paste(STRING,collapse=" ")
[1] "table dolve #10n #dec10 #nov8e  hello"
Blöder Wolf
quelle
0

Base R-Lösung:

unlisted_strings <- unlist(strsplit(X, "\\s+"))

Y <- paste0(na.omit(ifelse(grepl("[#]", unlisted_strings),

                           unlisted_strings,

                           gsub("\\d+", "", unlisted_strings))), collapse = " ")

Y 

Daten:

X <- as.character("table9 dolv5e #10n #dec10 #nov8e 23 hello")
Hallo Freund
quelle
Dies ergibt nicht die gewünschte Ausgabe.
user2474226
0
INPUT = "table9 dolv5e #10n #dec10 #nov8e 23 hello";
OUTPUT = INPUT.match(/[^#\d]+(#\w+|[A-Za-Z]+\w*)/gi).join('');

Sie können Flags entfernen i, da die Groß- und Kleinschreibung nicht berücksichtigt wurde

Verwenden Sie dieses Muster: [^#\d]+(#\w+|[A-Za-Z]+\w*)

[^#\d]+ = Zeichen beginnen mit keinem # und Ziffern #\w+ = find # gefolgt von Ziffer oder Buchstabe [A-Za-z]+\w*= find letter gefolgt von Buchstabe und / oder Zahl ^ | Sie können dies ändern mit \D+\S*= finden Sie ein beliebiges Zeichen, nicht nur, wenn das erste ein Buchstabe ist und nicht nur ein Buchstabe und / oder eine Zahl. Ich werde nicht als \w+\w*Ursache \wwie = angegeben [\w\d].

Ich habe den Code in JavaScript ausprobiert und er funktioniert. Wenn Sie eine Übereinstimmung nicht nur gefolgt von einem Buchstaben wünschen, können Sie Code verwenden

Transamunos
quelle