Как я могу заменить первое вхождение символа в каждом слове? - PullRequest
44 голосов
/ 25 февраля 2020

Как я могу заменить первое вхождение символа в каждом слове?

Скажем, у меня есть эта строка:

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

Просто для пояснения, символы "@" всегда появляются вместе в каждом слове, но могут быть в начале слова или между другими символов.

Мне удалось удалить символ "@", если он встречается только один раз, с помощью варианта регулярного выражения, обнаруженного в Удалить подстроку, когда это происходит один раз, но не дважды в строке в python, который использует отрицательный взгляд вперед и отрицательный взгляд назад:

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

См. Вывод:

>>> 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('@@', '@'), чтобы удалить «@», где бы он ни возникал снова.

Однако мне интересно: есть ли способ сделать эту замену за один выстрел?

Ответы [ 6 ]

51 голосов
/ 25 февраля 2020

Я бы сделал замену регулярного выражения по следующему шаблону:

@(@*)

И затем просто заменил на первую группу захвата, которая представляет собой непрерывные символы @, минус один.

Это должен захватывать каждое @, встречающееся в начале каждого слова, будь то слово в начале, середине или конце строки.

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 голосов
/ 25 февраля 2020

Как насчет использования 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 вхождений.

4 голосов
/ 25 февраля 2020

Вы можете использовать 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 голосов
/ 25 февраля 2020

Обдумывал случаи, когда только последний символ равен @ и вы не хотите его удалять, или у вас указано c разрешенных начальных символов, придумали следующее:

>>> ' '.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 голосов
/ 25 февраля 2020

DEMO

(?<!@)@

Вы можете попробовать это. Смотри демо.

1 голос
/ 08 марта 2020
# 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))

Выход:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...