Nano Hash - криптовалюты, майнинг, программирование

Поиск последнего вхождения подстроки в строке, замена этого

Итак, у меня есть длинный список строк в одном формате, и я хочу найти последний "." символ в каждом и замените его на ". -". Я пытался использовать rfind, но я не могу правильно использовать его для этого.

24.01.2013


Ответы:


1

Это должно сделать это

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:]
24.01.2013
  • Спасибо большое. Придется изучить это на минутку... это использование срезов, верно? 24.01.2013
  • @AdamMagyar да, container[a:b] нарезает фрагменты от индекса контейнера до b-1. Если 'a' опущено, то по умолчанию оно равно 0; если 'b' опущено, по умолчанию используется len(контейнер). Оператор плюс просто объединяет. Функция rfind, как вы указали, возвращает индекс, вокруг которого должна выполняться операция замены. 24.01.2013

  • 2

    Для замены справа:

    def replace_right(source, target, replacement, replacements=None):
        return replacement.join(source.rsplit(target, replacements))
    

    В использовании:

    >>> replace_right("asd.asd.asd.", ".", ". -", 1)
    'asd.asd.asd. -'
    
    24.01.2013
  • Мне определенно нравится это решение, но наличие параметра replacements=None кажется мне ошибкой, потому что, если параметр опущен, функция выдаст ошибку (попробовано в Python 2.7). Я бы предложил либо удалить значение по умолчанию, установить для него значение -1 (для неограниченных замен), либо лучше сделать его replacements=1 (что, я думаю, должно быть поведением по умолчанию для этой конкретной функции в соответствии с тем, что хочет ОП). Согласно документам, этот параметр является необязательным, но он должен быть int, если задано. 14.05.2016
  • На случай, если кому-то понадобится однострочник: ". -".join("asd.asd.asd.".rsplit(".", 1)). Все, что вы делаете, это выполняете разделение строки справа на 1 вхождение и снова соединяете строку, используя замену. 24.04.2020

  • 3

    Я бы использовал регулярное выражение:

    import re
    new_list = [re.sub(r"\.(?=[^.]*$)", r". - ", s) for s in old_list]
    
    24.01.2013
  • Это единственный ответ, который работает, если точки нет вообще. Я бы использовал просмотр вперед: \.(?=[^.]*$) 24.01.2013

  • 4

    Один вкладыш будет:

    str=str[::-1].replace(".",".-",1)[::-1]

    07.03.2016
  • Это неправильно. Вы переворачиваете строку, заменяете ее, а затем переворачиваете обратно. Вы делаете .replace на перевернутой строке. Обе строки, переданные в replace, также должны быть инвертированы. В противном случае, когда вы перевернете строку во второй раз, буквы, которые вы только что вставили, будут задом наперед. Вы можете использовать это только в том случае, если вы заменяете одну букву на одну букву, и даже тогда я бы не стал вставлять это в ваш код на случай, если кто-то должен будет изменить его в будущем и начнет задаваться вопросом, почему слово пишется sdrawkcab. 13.01.2019

  • 5

    Вы можете использовать функцию ниже, которая заменяет первое вхождение слова справа.

    def replace_from_right(text: str, original_text: str, new_text: str) -> str:
        """ Replace first occurrence of original_text by new_text. """
        return text[::-1].replace(original_text[::-1], new_text[::-1], 1)[::-1]
    
    02.08.2019

    6
    a = "A long string with a . in the middle ending with ."
    

    # если вы хотите найти индекс последнего вхождения любой строки, В нашем случае мы #найдем индекс последнего вхождения с помощью

    index = a.rfind("with") 
    

    # результат будет 44, так как индекс начинается с 0.

    11.01.2019

    7

    Наивный подход:

    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 . -'
    

    Ответ Адитьи Сихага с одним rfind:

    pos = a.rfind('.')
    a[:pos] + '. -' + a[pos+1:]
    
    24.01.2013
  • Это также меняет строку замены. Кроме этого, это повторение ответа root и, как я уже сказал, довольно неэффективно. 24.01.2013
  • @Lattyware Вы имеете в виду, что он переворачивает a? 24.01.2013
  • Я имею в виду, что он переворачивает '. -' на выходе. 24.01.2013
  • Просто ожидать, что пользователь реверсирует строковый литерал вручную, не лучшая идея - это может привести к ошибкам и неясности. 24.01.2013
  • @Lattyware Согласен. Я сделал это вар. (Я понимаю, что это неэффективный метод и подходит не во всех случаях - ваш replace_right намного лучше) 24.01.2013
  • Это не мое - я только что отредактировал пример ответа Вариндера Сингха - моей первой мыслью был и этот метод. 24.01.2013
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..