Um Regex para remover dígitos, exceto palavras que começam com #

8

Eu tenho algumas strings que podem conter letras, números e o símbolo '#'.

Gostaria de remover dígitos, exceto as palavras que começam com '#'

Aqui está um exemplo:

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

E a saída esperada é:

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

Como posso fazer isso com regex, stringr ou gsub?

castaa95
fonte

Respostas:

6

Que tal capturar o desejado e substituir o indesejado por vazio (não capturado).

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

Veja a demonstração em regex101 ou a demonstração R em tio.run (não tenho experiência com R)

Minha resposta está assumindo que sempre há espaço em branco entre eles #foo bar #baz2. Se você tiver algo parecido #foo1,bar2:#baz3 4, use\w (caractere de palavra) em vez de \S(sem espaço em branco).

bolha bobble
fonte
5

Você pode dividir a string em espaços, remover dígitos dos tokens se eles não começarem com '#' e colar novamente:

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
fonte
1

Você usa gsub para remover dígitos, por exemplo:

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

E podemos dividir sua string usando strsplit:

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

Só precisamos iterar por STRING, com gsub, aplicando-o apenas a elementos que não possuem "#"

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"
StupidWolf
fonte
0

Solução Base R:

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

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

                           unlisted_strings,

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

Y 

Dados:

X <- as.character("table9 dolv5e #10n #dec10 #nov8e 23 hello")
Olá amiga
fonte
isso não dá a saída desejada.
user2474226
0
INPUT = "table9 dolv5e #10n #dec10 #nov8e 23 hello";
OUTPUT = INPUT.match(/[^#\d]+(#\w+|[A-Za-Z]+\w*)/gi).join('');

Você pode remover sinalizadores i, porque não diferencia maiúsculas de minúsculas

Use este padrão: [^#\d]+(#\w+|[A-Za-Z]+\w*)

[^#\d]+ = início de caractere sem # e dígitos #\w+ = localizar # seguido de dígito ou letra [A-Za-z]+\w*= localizar letra seguida de letra e / ou número ^ | Você pode alterar isso com \D+\S*= encontre qualquer caractere não apenas quando o primeiro for letra e não apenas seguido por letra e / ou número. Eu não sou colocado como \w+\w*causa \wigual a = [\w\d].

Eu tentei o código em JavaScript e funcionou. Se você deseja que a correspondência não seja apenas seguida por uma letra, você pode usar o código

Transamunos
fonte