Her kelimedeki bir karakterin ilk oluşumunu nasıl değiştirebilirim?


44

Her kelimedeki bir karakterin ilk oluşumunu nasıl değiştirebilirim?

Diyelim ki bu dizeye sahibim:

hello @jon i am @@here or @@@there and want some@thing in '@here"
#     ^         ^^        ^^^                   ^          ^ 

Ve ben @her kelimede ilk kaldırmak istiyorum , böylece böyle bir son dize sahip sonunda:

hello jon i am @here or @@there and want something in 'here
#     ^        ^        ^^                   ^         ^

Açıklığa kavuşturmak için, "@" karakterleri her kelimede hep birlikte görünür, ancak kelimenin başında veya diğer karakterler arasında olabilir.

Bir kez gerçekleştiğinde Alt dizeyi sil'de bulduğum regex'in bir varyasyonunu kullanarak yalnızca bir kez gerçekleşirse "@" karakterini kaldırmayı başardım , ancak python'da bir negatif iki kez ve negatif bir geri dönüş kullanan bir satırda iki kez değil :

@(?!@)(?<!@@)

Çıktıya bakın:

>>> 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"

Yani bir sonraki adım, birden fazla kez meydana geldiğinde "@" yerine geçmektir. Bu, s.replace('@@', '@')"@" karakterini tekrar bulunduğu yerden kaldırmak için kolaydır .

Ancak merak ediyorum: Bu değişikliği tek seferde yapmanın bir yolu var mı?


1
Kesinlikle normal ifade cevabına mı ihtiyacınız var?
Sayandip Dutta

@SayandipDutta prensipte, evet, ama aynı zamanda bir regex olmadan aynısını yapmanın başka yollarını da görmek
isterdim

Sadece emin olmak için, böyle bir dizgi olabilir: ardışık @Hello@Therenerede @olmaz?
JvdV

1
@ DVDV hayır, böyle bir durum olmayacak.
fedorqui 'SO' zarar vermeyi durdur '25

Yanıtlar:


51

Aşağıdaki desende regex değiştirme yapardı:

@(@*)

Ve sonra sadece sürekli @ sembolleri olan eksi bir olan ilk yakalama grubuyla değiştirin.

Bu @, dizenin başında, ortasında veya sonunda bulunan sözcük olmak üzere her sözcüğün başlangıcında meydana gelen her şeyi yakalamalıdır .

inp = "hello @jon i am @@here or @@@there and want some@thing in '@here"
out = re.sub(r"@(@*)", '\\1', inp)
print(out)

Bu yazdırır:

hello jon i am @here or @@there and want something in 'here

35

replace('@', '', 1)Bir jeneratör ifadesinde kullanmaya ne dersiniz ?

string = 'hello @jon i am @@here or @@@there and want some@thing in "@here"'
result = ' '.join(s.replace('@', '', 1) for s in string.split(' '))

# output: hello jon i am @here or @@there and want something in "here"

İnt değeri 1isteğe bağlı countbağımsız değişkendir.

str.replace(old, new[, count])

Alt dize tüm oluşumları ile dizinin bir kopyasını döndürür eski yerini yeni . İsteğe bağlı bağımsız değişken sayısı verilirse, yalnızca ilk sayım olayları değiştirilir.


5
Bu akıllıca bir numara! Replace'in üçüncü parametresi olduğundan replace(search, replace, max_matches), her sözcükteki ilk parametrenin yerine geçer.
fedorqui 'SO' zarar vermeyi durdur '25

1
@ fedorqui'SOstopharming 'evet, denir count, dokümanlardan açıklama ekledim.
Guy

2
Bu yan etkiye dikkat edin: birkaç beyaz boşluğunuz ('') varsa, bunlar kaybolur ve tek bir '' ile değiştirilir.
Marc Vanhoomissen

4

Bunun gibi kullanabilirsiniz re.sub:

import re

s = "hello @jon i am @@here or @@@there and want some@thing in '@here"
s = re.sub('@(\w)', r'\1', s)
print(s)

Bunun sonucu:

"hello jon i am @here or @@there and want something in 'here"

Ve işte bir kavram kanıtı:

>>> import re
>>> s = "hello @jon i am @@here or @@@there and want some@thing in '@here"
>>> re.sub('@(\w)', r'\1', s)
"hello jon i am @here or @@there and want something in 'here"
>>> 

2

Sadece son karakter varsa @ve onu kaldırmak istemiyorsanız veya izin verilen belirli başlangıç ​​karakterleriniz varsa, bununla ilgileniyordu:

>>> ' '.join([s_.replace('@', '', 1) if s_[0] in ["'", "@"] else s_ for s_ in s.split()])
"hello jon i am @here or @@there and want some@thing in 'here"

Veya @yalnızca ilk n karakterdeyse değiştirmek istediğinizi varsayalım

>>> ' '.join([s_.replace('@', '', 1) if s_.find('@') in range(2) else s_ for s_ in s.split()])
"hello jon i am @here or @@there and want some@thing in 'here"


1
# Python3 program to remove the @ from String


def ExceptAtTheRate(string):
    # Split the String based on the space
    arrOfStr = string.split()

    # String to store the resultant String
    res = ""

    # Traverse the words and
    # remove the first @ From every word.
    for a in arrOfStr:
        if(a[0]=='@'):
            res += a[1:len(a)] + " "
        else:
            res += a[0:len(a)] + " "

    return res


# Driver code
string = "hello @jon i am @@here or @@@there and want some@thing in '@here"

print(ExceptAtTheRate(string))

Çıktı:

resim açıklamasını buraya girin


Teşekkürler! O Not @ içindeki bazı @ şey ve '@here de benim ihtiyaçlarına göre, çıkarılmalıdır.
fedorqui 'SO' zarar vermeyi kes '
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.