Làm thế nào tôi có thể thay thế lần xuất hiện đầu tiên của một ký tự trong mỗi từ?


44

Làm thế nào tôi có thể thay thế lần xuất hiện đầu tiên của một ký tự trong mỗi từ?

Nói rằng tôi có chuỗi này:

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

Và tôi muốn xóa từ đầu tiên @trên mỗi từ để cuối cùng tôi có chuỗi cuối cùng như thế này:

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

Chỉ cần làm rõ, các ký tự "@" luôn xuất hiện cùng nhau trong mỗi từ, nhưng có thể ở đầu từ hoặc giữa các ký tự khác.

Tôi đã quản lý để loại bỏ ký tự "@" nếu nó chỉ xảy ra một lần bằng cách sử dụng biến thể của biểu thức chính mà tôi tìm thấy trong chuỗi con Xóa khi nó xuất hiện một lần, nhưng không phải khi hai lần liên tiếp trong python , sử dụng giao diện phủ định và giao diện phủ định:

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

Xem đầu ra:

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

Vì vậy, bước tiếp theo là thay thế "@" khi nó xảy ra nhiều lần. Điều này thật dễ dàng bằng cách s.replace('@@', '@')xóa "@" khỏi bất cứ nơi nào nó xảy ra lần nữa.

Tuy nhiên, tôi tự hỏi: có cách nào để thực hiện thay thế này trong một lần chụp không?


1
Bạn có cần một câu trả lời regex đúng không?
Sayandip Dutta

@SayandipDutta về nguyên tắc, vâng, nhưng tôi cũng tò mò muốn xem những cách khác để làm điều tương tự mà không cần regex :)
fedorqui 'SO ngừng làm hại'

Chỉ để đảm bảo, có thể có chuỗi như: @Hello@Therenơi @sẽ không liên tiếp?
JvdV

1
@JvdV không, sẽ không có trường hợp như vậy.
fedorqui 'SO ngừng gây hại'

Câu trả lời:


51

Tôi sẽ thực hiện thay thế regex theo mẫu sau:

@(@*)

Và sau đó chỉ cần thay thế bằng nhóm chụp đầu tiên, đó là tất cả các biểu tượng @ liên tục, trừ đi một biểu tượng.

Điều này sẽ nắm bắt mọi @xảy ra ở đầu mỗi từ, là từ đó ở đầu, giữa hoặc cuối chuỗi.

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

Bản in này:

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

35

Làm thế nào về việc sử dụng replace('@', '', 1)trong một biểu thức máy phát điện?

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"

Giá trị int 1countđối số tùy chọn .

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

Trả về một bản sao của chuỗi với tất cả các lần xuất hiện của chuỗi con cũ được thay thế bằng mới . Nếu số lượng đối số tùy chọn được đưa ra, chỉ các lần xuất hiện đếm đầu tiên được thay thế.


5
Đó là một mẹo thông minh! Vì tham số thứ ba thay thế là replace(search, replace, max_matches), nó chỉ thay thế tham số đầu tiên trên mỗi từ.
fedorqui 'SO ngừng gây hại'

1
@ fedorqui'SOstopharming 'vâng, nó được gọi count, tôi đã thêm mô tả từ các tài liệu.
Chàng trai

2
Cảnh giác với tác dụng phụ này: trong trường hợp bạn có một vài khoảng trắng (''), chúng sẽ bị mất và được thay thế bằng một dấu ''.
Marc Vanhoomissen

4

Bạn có thể sử dụng re.subnhư thế này:

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)

Điều đó sẽ dẫn đến:

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

Và đây là một bằng chứng về khái niệm:

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

Đã cân nhắc cho các trường hợp nếu chỉ có char cuối cùng @và bạn không muốn xóa nó, hoặc bạn có ký tự bắt đầu được cho phép cụ thể, đã đưa ra điều này:

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

Hoặc giả sử bạn chỉ muốn thay thế @nếu nó ở n ký tự đầu tiên

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

Đầu ra:

nhập mô tả hình ảnh ở đây


Cảm ơn! Lưu ý rằng @ trong một số điều @'@here cũng nên được xóa, theo yêu cầu của tôi.
fedorqui 'SO ngừng làm hại'
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.