Mam długą listę ciągów w tym samym formacie i chcę znaleźć ostatni "." znak w każdym z nich i zastąp go ". -". Próbowałem używać rfind, ale nie wydaje się, aby użyć go prawidłowo, aby to zrobić.Znajdowanie ostatniego wystąpienia podciągu w łańcuchu, zastępowanie tego
Odpowiedz
to powinien to zrobić
old_string = "this is going to have a full stop. some written sstuff!"
k = old_string.rfind(".")
new_string = old_string[:k] + ". - " + old_string[k+1:]
użyłbym regex:
import re
new_list = [re.sub(r"\.(?=[^.]*$)", r". - ", s) for s in old_list]
Jest to jedyna odpowiedź, która działa jeśli w ogóle nie ma kropki. Użyłbym jednak strony z wyprzedzeniem: '\. (? = [^.] * $)' – georg
@ thg435: Dobry pomysł, dzięki! –
naiwne podejście:
a = "A long string with a . in the middle ending with ."
fchar = '.'
rchar = '. -'
a[::-1].replace(fchar, rchar[::-1], 1)[::-1]
Out[2]: 'A long string with a . in the middle ending with . -'
odpowiedź Aditya Sihag za pomocą pojedynczego rfind
:
pos = a.rfind('.')
a[:pos] + '. -' + a[pos+1:]
Powoduje to również odwrócenie ciągu zastępczego. Poza tym jest to powtórzenie odpowiedzi root'a i, jak mówię, dość nieefektywna. –
@Lattyware Masz na myśli, że odwraca "a"? –
Mam na myśli, że odwraca ". -'' na wyjściu. –
Aby wymienić od prawej:
def replace_right(source, target, replacement, replacements=None):
return replacement.join(source.rsplit(target, replacements))
w użyciu:
>>> replace_right("asd.asd.asd.", ".", ". -", 1)
'asd.asd.asd. -'
+1, podoba mi się ta wersja. Proste i skuteczne, a także nie mające oczywistych nieefektywności. –
Ah Podoba mi się to, bardzo. Dziękuję również! –
Wziąłem trochę swobody w przerobieniu twojego przykładu dla jasności i dopasowania go do przykładu OP. Czuję się źle, zmieniając odpowiedź tak bardzo - ale podstawowa treść jest taka sama i wydaje mi się, że poprawia ją, więc mam nadzieję, że wszystko będzie dobrze. –
Jeden liner będzie:
str=str[::-1].replace(".",".-",1)[::-1]
działa dobrze, aby zastąpić ostatnie wystąpienie! – Lydia
- 1. znajdowanie ostatniego wystąpienia pozycji na liście python
- 2. Zastępowanie znaków w łańcuchu
- 3. Swift :: Liczba wystąpień podciągu w łańcuchu
- 4. Wymiana ostatniego znaku w łańcuchu
- 5. Znajdowanie końca dopasowania podciągu w .NET
- 6. Znajdowanie wszystkich pozycji podciągu w większym ciągu w języku C#
- 7. Znajdowanie wartości null w łańcuchu wywołań metod
- 8. Znajdowanie podwójnych spacji w łańcuchu znaków - Python
- 9. Znajdowanie ostatniego indeksu łańcucha znaków w Oracle
- 10. Znajdowanie i zastępowanie tekstu w IntelliJ IDEA
- 11. Znajdowanie i zastępowanie nawiasów w ciągu w wiązach 0.16
- 12. Usunąć wszystkie wystąpienia poza ostatnim?
- 13. Jak znaleźć wystąpienia ciągu w łańcuchu w C++?
- 14. Vim - Usuń do ostatniego wystąpienia znaku w linii
- 15. Zastępowanie liczb w łańcuchu za pomocą wyrażeń regularnych w javascript
- 16. Wydajny/prosty sposób na zastąpienie każdego wystąpienia, ale ostatnie wystąpienie podciągu w ciągu znaków (str_replace_except_last)?
- 17. Zastępowanie spacji za pomocą podkreśleń w JavaScript?
- 18. Objective-C NSRegularExpressions, znajdowanie pierwszego wystąpienia liczb w ciągu
- 19. wyrażenie regularne pasujące do wszystkiego, aż do ostatniego wystąpienia/
- 20. Uzyskaj indeks n-tego wystąpienia ciągu znaków?
- 21. wyszukiwania podciągu w RavenDB
- 22. Znajdź i zastąp n-tego wystąpienia [nawiasach] wypowiedzi w struny
- 23. VIM: Znajdowanie i zastępowanie pierwszych N wystąpień słowa
- 24. Jak usunąć pierwsze wystąpienie podciągu w ciągu?
- 25. Znajdowanie i zastępowanie brakujących wartości z rzędu znaczy
- 26. Znaleźć drugie wystąpienie podciągu w ciągu znaków w Javie
- 27. Jak zapisać i ponownie użyć tego samego wystąpienia fragmentów?
- 28. Zastępowanie sekwencji znaków w java
- 29. Znajdź zadzwonił podciągu w NSMutableAttributedString
- 30. Wyszukiwanie podciągu w obiekcie NSString
Jedne wkładki są świetne i wszystkie, ale najlepiej byłoby zrobić 'str.rfind()' tylko raz dla zwiększenia wydajności. –
Wielkie dzięki. Będę musiał to przestudiować przez chwilę ... to wykorzystuje plastry, prawda? –
@AdamMagyar yes, container [a: b] plasterki od indeksu kontenera do b-1. Jeśli "a" jest pominięte, wówczas domyślnie przyjmuje wartość 0; jeśli "b" jest pominięte, domyślnie jest to len (kontener). Operator plus po prostu się łączy. Funkcja rfind, jak wskazano, zwraca indeks, wokół którego powinna nastąpić operacja wymiany. –