Як я можу замінити перше виникнення символу в кожному слові?


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

Для уточнення символи "@" завжди з'являються разом у кожному слові, але можуть бути на початку слова або між іншими символами.

Мені вдалося видалити символ "@", якщо він виникає лише один раз, використовуючи варіацію регулярного вираження, який я знайшов у " Видаліть підрядку", коли він виникає один раз, але не тоді, коли два рази поспіль у 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('@@', '@')видаливши "@" з того місця, де воно знову виникає.

Однак мені цікаво: чи є спосіб зробити цю заміну за один кадр?


1
Вам потрібна суворо зворотна відповідь?
Саяндіп Дутта,

@SayandipDutta в принципі, так, але мені також було б цікаво побачити інші способи зробити те ж саме без регулярного
виразу

Щоб переконатися, чи може бути такий рядок, як: @Hello@Thereде @не було б послідовним?
JvdV

1
@JvdV ні, такого випадку не буде.
fedorqui 'ТАК перестаньте шкодити'

Відповіді:


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"

Значення int 1- необов'язковий countаргумент.

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

Повернути копію рядка з усіма входженнями старої підстроки, заміненої на нову . Якщо вказано необов'язковий підрахунок аргументів , замінюються лише перші випадки підрахунку аргументів .


5
Це розумний трюк! Оскільки третій параметр заміни є replace(search, replace, max_matches), він просто замінює перший на кожному слові.
fedorqui 'ТАК перестань шкодити'

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"

2

DEMO

(?<!@)@

Ви можете спробувати це. Дивіться демонстрацію.


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 'ТАК перестаньте шкодити'
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.