मैं हर शब्द में एक चरित्र की पहली घटना को कैसे बदल सकता हूं?


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

स्पष्टीकरण के लिए, "@" अक्षर हमेशा प्रत्येक शब्द में एक साथ दिखाई देते हैं, लेकिन शब्द की शुरुआत में या अन्य वर्णों के बीच हो सकते हैं।

मैं "@" वर्ण को निकालने में कामयाब रहा अगर यह एक बार होने वाले रीगेक्स की भिन्नता का उपयोग करके एक बार होता है, जिसे मैंने डिलीट करने के लिए डिलीट किया है, लेकिन एक बार नहीं, जब अजगर में एक पंक्ति में दो बार , जो एक नकारात्मक लुकहैड और नकारात्मक डबहाइंड का उपयोग करता है:

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

आउटपुट देखें:

>>> 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
क्या आपको सख्ती से रेगेक्स उत्तर की आवश्यकता है?
सायंदिप दत्ता

@SayandipDutta सिद्धांत रूप में, हाँ, लेकिन मैं भी एक regex के बिना एक ही करने के लिए अन्य तरीकों को देखने के लिए उत्सुक हो जाएगा :)
Fedorqui 'SO रोक नुकसान पहुंचाने'

बस यह सुनिश्चित करने के लिए, क्या स्ट्रिंग जैसी हो सकती है: @Hello@Thereजहां @लगातार नहीं होगी?
JvdV

1
@JvdV नहीं, ऐसा कोई मामला नहीं होगा।
फेडोरक्वी 'एसओ स्टॉप हार्मिंग'

जवाबों:


51

मैं निम्नलिखित पैटर्न पर रेगेक्स प्रतिस्थापन करूंगा:

@(@*)

और फिर बस पहले कैप्चर समूह के साथ बदलें, जो सभी महाद्वीप @ प्रतीक, शून्य से एक है।

यह @प्रत्येक शब्द की शुरुआत में होने वाले प्रत्येक को पकड़ना चाहिए , यह शब्द स्ट्रिंग के आरंभ, मध्य या अंत में होना चाहिए।

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"

1वैकल्पिक countतर्क का अंतर मान है ।

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

स्ट्रिंग की एक प्रति लौटाएं जिसमें पुराने द्वारा प्रतिस्थापित किए गए सभी आवृत्तियों को नई से बदल दिया जाए । यदि वैकल्पिक तर्क गणना दी जाती है, तो केवल पहली गणना घटित होती है।


5
यह एक चतुर चाल है! चूंकि रिप्लेसमेंट का तीसरा पैरामीटर है replace(search, replace, max_matches), यह हर शब्द पर पहले वाले को बदल देता है।
फेडोरक्वी 'एसओ स्टॉप हार्मिंग'

1
@ fedorqui'SOstopharming 'हाँ, यह कहा जाता है count, मैंने डॉक्स से विवरण जोड़ा।
लड़का

2
इस साइड इफेक्ट के लिए बाहर देखें: यदि आपके पास कई सफेद स्थान ('') हैं, तो वे खो जाएंगे और एक एकल '' द्वारा प्रतिस्थापित किए जाएंगे।
मार्क वॉनहोमिसन

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

आउटपुट:

यहाँ छवि विवरण दर्ज करें


धन्यवाद! ध्यान दें कि @ भीतर कुछ @ बात और '@here भी, मेरे आवश्यकताओं के अनुसार हटा दिया जाना चाहिए।
फेडोरक्वी 'एसओ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.