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?


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

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.


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

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"


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


Terima kasih! Perhatikan bahwa @ dalam beberapa @ hal dan '@di sini juga harus dihapus, sesuai persyaratan saya.
fedorqui 'SO stop harming'
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.