ฉันจะแทนที่การปรากฏตัวครั้งแรกของตัวละครในทุกคำได้อย่างไร


44

ฉันจะแทนที่การปรากฏตัวครั้งแรกของตัวละครในทุกคำได้อย่างไร

พูดว่าฉันมีสายนี้:

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

และฉันต้องการที่จะลบคำแรก@ในทุกคำเพื่อที่ฉันจะได้สตริงสุดท้ายดังนี้:

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

เพียงเพื่อความกระจ่างตัวอักษร "@" จะปรากฏขึ้นพร้อมกันทุกคำ แต่อาจเป็นตัวเริ่มต้นของคำหรือระหว่างตัวอักษรอื่น ๆ

ฉันจัดการเพื่อลบอักขระ "@" ถ้ามันเกิดขึ้นเพียงครั้งเดียวโดยใช้รูปแบบของ regex ที่ฉันพบในDelete substring เมื่อมันเกิดขึ้นครั้งเดียว แต่ไม่ใช่เมื่อสองครั้งในแถวในหลามซึ่งใช้ lookahead เชิงลบและ lookbehind เชิงลบ:

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

ดูผลลัพธ์:

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

ดังนั้นขั้นตอนต่อไปคือการแทนที่ "@" เมื่อมันเกิดขึ้นมากกว่าหนึ่งครั้ง การดำเนินการนี้ทำได้ง่ายโดยs.replace('@@', '@')ลบ "@" ออกจากที่ใดก็ตามที่เกิดขึ้นอีกครั้ง

อย่างไรก็ตามฉันสงสัยว่า: มีวิธีใดที่จะทดแทนสิ่งนี้ได้ในนัดเดียว?


1
คุณต้องการคำตอบ regex อย่างเคร่งครัดหรือไม่?
Sayandip Dutta

@SayandipDutta ตามหลักการแล้วใช่ แต่ฉันก็อยากรู้อยากเห็นวิธีอื่น ๆ ที่จะทำแบบเดียวกันโดยไม่ต้อง regex :)
fedorqui 'ดังนั้นหยุดทำร้าย'

เพียงเพื่อให้แน่ใจว่าอาจมีสตริงเช่น: @Hello@Thereที่@จะไม่ติดต่อกัน?
JvdV

1
@ JvdV ไม่จะไม่มีกรณีดังกล่าว
fedorqui 'ดังนั้นหยุดทำอันตราย'

คำตอบ:


51

ฉันจะทำการแทนที่ regex ในรูปแบบต่อไปนี้:

@(@*)

จากนั้นก็แทนที่กลุ่มการจับภาพแรกซึ่งเป็นสัญลักษณ์ @ ต่อเนื่องทั้งหมดลบหนึ่งอัน

สิ่งนี้ควรจับทุกสิ่งที่@เกิดขึ้นที่จุดเริ่มต้นของแต่ละคำไม่ว่าจะเป็นคำนั้นในตอนต้นกลางหรือปลายของสตริง

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

ภาพพิมพ์นี้:

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

35

วิธีการเกี่ยวกับการใช้replace('@', '', 1)ในการแสดงออกกำเนิด?

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"

ค่า int ของ1คือcountอาร์กิวเมนต์ที่เป็นทางเลือก

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

กลับสำเนาของสตริงกับเหตุการณ์ที่เกิดขึ้นทั้งหมดของ substring เก่าแทนที่ด้วยใหม่ หากนับอาร์กิวเมนต์ที่เป็นทางเลือก จะได้รับเฉพาะการนับครั้งแรกที่เกิดขึ้น


5
นั่นเป็นเคล็ดลับที่ฉลาด! เนื่องจากพารามิเตอร์ตัวที่สามของ replace เป็นreplace(search, replace, max_matches)เพียงแค่แทนที่พารามิเตอร์แรกในทุกคำ
fedorqui 'ดังนั้นหยุดการทำร้าย'

1
@ fedorqui'SOstopharming 'ใช่เรียกว่าcountฉันเพิ่มคำอธิบายจากเอกสาร
Guy

2
ระวังผลข้างเคียงนี้: ในกรณีที่คุณมีช่องว่างสีขาวหลายอัน ('') พวกเขาจะหายไปและแทนที่ด้วย '' เดียว
Marc Vanhoomissen

4

คุณสามารถใช้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)

ที่จะส่งผลให้:

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

และนี่คือข้อพิสูจน์แนวคิด:

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

ไตร่ตรองในกรณีที่เกิดอะไรขึ้นถ้ามีเพียงถ่านตัวสุดท้าย@และคุณไม่ต้องการที่จะลบมันออกหรือคุณมีตัวอักษรเริ่มต้นที่ได้รับอนุญาตเฉพาะขึ้นมาด้วย:

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

หรือสมมติว่าคุณต้องการแทนที่@เฉพาะในกรณีที่มีอักขระ 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))

เอาท์พุท:

ป้อนคำอธิบายรูปภาพที่นี่


ขอบคุณ! โปรดทราบว่าควรลบ@ภายในบางสิ่งและ' @ ที่นั่นตามความต้องการของฉัน
fedorqui 'ดังนั้นหยุดการทำร้าย'
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.