Como posso substituir a primeira ocorrência de um caractere em cada palavra?
Digamos que eu tenho esta string:
hello @jon i am @@here or @@@there and want some@thing in '@here"
# ^ ^^ ^^^ ^ ^
E eu quero remover a primeira @
em cada palavra, para que eu tenha uma sequência final como esta:
hello jon i am @here or @@there and want something in 'here
# ^ ^ ^^ ^ ^
Apenas para esclarecimento, os caracteres "@" sempre aparecem juntos em todas as palavras, mas podem estar no início da palavra ou entre outros caracteres.
Eu consegui remover o caractere "@" se ele ocorrer apenas uma vez, usando uma variação do regex que encontrei em Excluir substring quando ocorre uma vez, mas não quando duas vezes seguidas em python , que usa um lookahead negativo e um lookback negativo:
@(?!@)(?<!@@)
Veja a saída:
>>> s = "hello @jon i am @@here or @@@there and want some@thing in '@here"
>>> re.sub(r'@(?!@)(?<!@@)', '', s)
"hello jon i am @@here or @@@there and want something in 'here"
Portanto, o próximo passo é substituir o "@" quando ocorrer mais de uma vez. Isso é fácil, s.replace('@@', '@')
removendo o "@" de onde ele ocorre novamente.
No entanto, eu me pergunto: existe uma maneira de fazer essa substituição de uma só vez?
@Hello@There
onde@
não seria consecutivo?Respostas:
Eu faria uma substituição de regex no seguinte padrão:
E então substitua pelo primeiro grupo de captura, que é todo contínuo @ símbolos, menos um.
Isso deve capturar todas as
@
ocorrências no início de cada palavra, seja essa no início, no meio ou no final da sequência.Isso imprime:
fonte
Que tal usar
replace('@', '', 1)
em uma expressão geradora?O valor int de
1
é ocount
argumento opcional .str.replace(old, new[, count])
fonte
replace(search, replace, max_matches)
, ele substitui o primeiro de cada palavra.count
, eu adicionei a descrição dos documentos.Você pode usar
re.sub
assim:Isso resultará em:
E aqui está uma prova de conceito:
fonte
Estava pensando em casos e se apenas o último caractere é
@
e você não deseja removê-lo, ou se você tem caracteres iniciais permitidos específicos, veio com isso:Ou, suponha que você queira substituir
@
apenas se estiver nos primeiros n caracteresfonte
DEMO
Você pode tentar isso. Veja a demonstração.
fonte
Resultado:
fonte