Jak mogę zastąpić pierwsze wystąpienie znaku w każdym słowie?
Powiedz, że mam ten ciąg:
hello @jon i am @@here or @@@there and want some@thing in '@here"
# ^ ^^ ^^^ ^ ^
I chcę usunąć pierwszy @
z każdego słowa, aby w końcu uzyskać końcowy ciąg taki jak ten:
hello jon i am @here or @@there and want something in 'here
# ^ ^ ^^ ^ ^
Dla wyjaśnienia znaki „@” zawsze pojawiają się razem w każdym słowie, ale mogą znajdować się na początku słowa lub między innymi znakami.
Udało mi się usunąć znak „@”, jeśli występuje on tylko raz, używając odmiany wyrażenia regularnego znalezionego w opcji Usuń podciąg, gdy występuje on raz, ale nie raz, gdy dwa razy z rzędu w pythonie , który używa negatywnego spojrzenia przed i negatywnego spojrzenia:
@(?!@)(?<!@@)
Zobacz wynik:
>>> 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"
Kolejnym krokiem jest zastąpienie litery „@”, gdy występuje ona więcej niż jeden raz. Jest to łatwe, s.replace('@@', '@')
usuwając znak „@” z dowolnego miejsca, w którym występuje ponownie.
Zastanawiam się jednak: czy istnieje sposób, aby zrobić to zastąpienie jednym strzałem?
@Hello@There
gdzie@
nie byłoby następujących po sobie?Odpowiedzi:
Zrobiłbym zamianę wyrażenia regularnego według następującego wzoru:
A potem po prostu zastąp pierwszą grupą przechwytywania, która jest ciągłymi symbolami @, minus jeden.
Powinno to uchwycić każde
@
wystąpienie na początku każdego słowa, czy to słowo na początku, w środku lub na końcu łańcucha.To drukuje:
źródło
Co powiesz na użycie
replace('@', '', 1)
w wyrażeniu generatora?Wartość int
1
jest opcjonalnymcount
argumentem.str.replace(old, new[, count])
źródło
replace(search, replace, max_matches)
, po prostu zastępuje pierwszy z każdego słowa.count
, dodałem opis z dokumentacji.Możesz użyć w
re.sub
ten sposób:Spowoduje to:
A oto dowód koncepcji:
źródło
Zastanawiałem się nad przypadkami, co, jeśli tylko ostatni znak jest
@
i nie chcesz go usunąć lub masz określone dozwolone znaki początkowe, wymyślił to:Lub załóżmy, że chcesz zastąpić
@
tylko, jeśli zawiera on pierwsze n znakówźródło
PRÓBNY
Możesz tego spróbować. Zobacz demo.
źródło
Wynik:
źródło