Bagaimana saya bisa mengganti kemunculan karakter pertama di setiap kata?

44

Bagaimana saya bisa mengganti kemunculan karakter pertama di setiap kata?

Katakanlah saya punya string ini:

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

Dan saya ingin menghapus yang pertama @pada setiap kata, sehingga akhirnya saya memiliki string terakhir seperti ini:

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

Hanya untuk klarifikasi, karakter "@" selalu muncul bersama di setiap kata, tetapi bisa di awal kata atau di antara karakter lain.

Saya berhasil menghapus karakter "@" jika itu terjadi hanya sekali dengan menggunakan variasi regex yang saya temukan di Hapus substring ketika itu terjadi sekali, tetapi tidak ketika dua kali berturut-turut dalam python , yang menggunakan lookahead negatif dan lookbehind negatif:

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

Lihat hasilnya:

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

Jadi langkah selanjutnya adalah mengganti "@" ketika itu terjadi lebih dari satu kali. Ini mudah dengan melakukan s.replace('@@', '@')untuk menghapus "@" dari mana pun itu terjadi lagi.

Namun, saya bertanya-tanya: apakah ada cara untuk melakukan penggantian ini dalam satu kesempatan?

fedorqui 'SO berhenti merugikan'
sumber
1
Apakah Anda memerlukan jawaban ketat regex?
Sayandip Dutta
@SayandipDutta pada prinsipnya, ya, tapi saya juga ingin tahu melihat cara lain untuk melakukan hal yang sama tanpa regex :)
fedorqui 'SO stop harming'
Hanya untuk memastikan, mungkinkah ada string seperti: di @Hello@Theremana @tidak akan berturut-turut?
JvdV
1
@ JPV tidak, tidak akan ada kasus seperti itu.
fedorqui 'SO stop harming'

Jawaban:

51

Saya akan melakukan penggantian regex pada pola berikut:

@(@*)

Dan kemudian ganti dengan kelompok tangkapan pertama, yang semuanya merupakan simbol kontinu, minus satu.

Ini harus menangkap setiap yang @terjadi pada awal setiap kata, baik kata itu di awal, tengah, atau akhir string.

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

Ini mencetak:

hello jon i am @here or @@there and want something in 'here
Tim Biegeleisen
sumber
35

Bagaimana kalau menggunakan replace('@', '', 1)ekspresi generator?

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"

Nilai int 1adalah countargumen opsional .

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

Kembalikan salinan string dengan semua kemunculan substring yang lama diganti dengan yang baru . Jika jumlah argumen opsional diberikan, hanya jumlah hitungan pertama yang diganti.

Orang
sumber
5
Itu trik yang cerdas! Karena parameter ketiga ganti adalah replace(search, replace, max_matches), itu hanya menggantikan yang pertama pada setiap kata.
fedorqui 'SO stop harming'
1
@ fedorqui'SOstopharming 'ya, ini namanya count, saya menambahkan deskripsi dari dokumen.
Guy
2
Perhatikan efek samping ini: jika Anda memiliki beberapa spasi putih (''), mereka akan hilang dan digantikan oleh satu ''.
Marc Vanhoomissen
4

Anda bisa menggunakan re.subseperti ini:

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)

Itu akan menghasilkan:

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

Dan inilah bukti konsep:

>>> 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"
>>> 
accdias
sumber
2

Sedang mempertimbangkan untuk kasus-kasus bagaimana jika hanya karakter terakhir @dan Anda tidak ingin menghapusnya, atau Anda memiliki karakter awal yang diizinkan yang spesifik, muncul dengan ini:

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

Atau, misalkan Anda ingin mengganti @hanya jika ada dalam karakter n pertama

>>> ' '.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"
Sayandip Dutta
sumber
2

DEMO

(?<!@)@

Anda bisa mencoba ini. Lihat demo.

vks
sumber
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))

Keluaran:

masukkan deskripsi gambar di sini

Amar Kumar
sumber
Terima kasih! Perhatikan bahwa @ dalam beberapa @ hal dan '@di sini juga harus dihapus, sesuai persyaratan saya.
fedorqui 'SO stop harming'