すべての単語で最初に出現する文字を置き換えるにはどうすればよいですか?


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

明確にするために、「@」文字は常にすべての単語で一緒に表示されますが、単語の先頭または他の文字の間に置くことができます。

「@」文字が1回だけ発生した場合は、部分文字列の削除で見つかった正規表現のバリエーションを使用して、1回発生したとき削除しましたが、負の先読みと負の後読みを使用するpythonの行で2回ではありません

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

出力を確認します。

>>> 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
厳密に正規表現の答えが必要ですか?
Sayandip Dutta

@SayandipDuttaは原則として、そうですが、正規表現なしで同じことを行う他の方法も
知りたいです

念のため、次のような文字列@Hello@Thereがある@でしょうか。
JvdV

1
@JvdVいいえ、そのようなケースはありません。
fedorqui 'SO stop harming'

回答:


51

私は次のパターンで正規表現の置き換えを行います:

@(@*)

次に、最初のキャプチャグループに置き換えます。これは、すべて連続する@記号から1を引いたものです。

これは@、各単語の先頭に出現するすべてをキャプチャする必要があります。文字列の先頭、中間、または末尾にある単語をキャプチャします。

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

部分文字列oldのすべての出現箇所をnewで置き換えた文字列のコピーを返します。オプションの引数countが指定されている場合 、最初のcount個の出現のみが置き換えられます。


5
それは巧妙なトリックです!replaceの3番目のパラメーターはreplace(search, replace, max_matches)なので、すべての単語の最初のパラメーターを置き換えるだけです。
fedorqui 'SO stop harming'

1
@ fedorqui'SOstopharming 'はい、それはと呼ばcountれ、ドキュメントから説明を追加しました。

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"

2

デモ

(?<!@)@

これを試すことができます。デモをご覧ください。


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はまた私の要件に応じて、削除する必要があります。
fedorqui 'SO stop harming'
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.