Una expresión regular para eliminar dígitos, excepto las palabras que comienzan con #

8

Tengo algunas cadenas que pueden contener letras, números y el símbolo '#'.

Me gustaría eliminar dígitos, excepto las palabras que comienzan con '#'

Aquí hay un ejemplo:

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

Y la salida esperada es:

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

¿Cómo puedo hacer esto con regex, stringr o gsub?

castaa95
fuente

Respuestas:

6

¿Qué tal capturar lo deseado y reemplazar lo no deseado con vacío (no capturado)?

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

Ver demo en regex101 o R demo en tio.run (No tengo experiencia con R)

Mi respuesta es suponer que siempre hay espacios en blanco entre ellos #foo bar #baz2. Si tiene algo así #foo1,bar2:#baz3 4, use\w (carácter de palabra) en lugar de \S(sin espacios en blanco).

burbuja bobble
fuente
5

Puede dividir la cadena en espacios, eliminar dígitos de los tokens si no comienzan con '#' y pegar:

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"
usuario2474226
fuente
1

Utiliza gsub para eliminar dígitos, por ejemplo:

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

Y podemos dividir su cadena usando strsplit:

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

Solo necesitamos iterar a través de STRING, con gsub, aplicándolo solo a elementos que no tienen "#"

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"
Estúpido Lobo
fuente
0

Solución base R:

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

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

                           unlisted_strings,

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

Y 

Datos:

X <- as.character("table9 dolv5e #10n #dec10 #nov8e 23 hello")
Hola amigo
fuente
Esto no da el resultado deseado.
user2474226
0
INPUT = "table9 dolv5e #10n #dec10 #nov8e 23 hello";
OUTPUT = INPUT.match(/[^#\d]+(#\w+|[A-Za-Z]+\w*)/gi).join('');

Puede quitar banderas i, porque no distingue entre mayúsculas y minúsculas

Usa este patrón: [^#\d]+(#\w+|[A-Za-Z]+\w*)

[^#\d]+ = comienzo de caracteres sin # y dígitos #\w+ = buscar # seguido de dígito o letra [A-Za-z]+\w*= buscar letra seguida de letra y / o número ^ | Puede cambiar esto con \D+\S*= buscar cualquier carácter, no solo cuando el primero es letra y no solo seguido de letra y / o número. No estoy puesto como \w+\w*causa \wigual que = [\w\d].

Probé el código en JavaScript y funciona. Si desea una coincidencia no solo seguida de una letra, puede usar el código

Transamunos
fuente