#python #string #find
#python #строка #Найти
Вопрос:
Я ищу простой метод определения последней позиции строки внутри другой строки… например. Если бы у меня было: file = C:UsersUserDesktopgo.py
и я хотел обрезать это так, чтобы file = go.py
Обычно мне приходилось бы выполнять C:UsersUserDesktopgo.py
инструкцию loop find, и каждый раз, когда она сталкивалась с
, она спрашивала… является последним
в строке? … Как только я нашел последнее
, я бы тогда file = file[last:len(file)]
Мне любопытно узнать, есть ли более быстрый и аккуратный способ сделать это .. предпочтительно без цикла.
Что-то вроде file = [file('',
last ):len(file)]
Если нет ничего подобного тому, что я показал выше… тогда можем ли мы каким-то образом поместить цикл внутри [:]
. Что-то вроде file = [for i in ...:len(file)]
спасибо 🙂
Ответ №1:
Если речь идет только о путях к файлам, вы можете использовать os.path.basename
:
>>> import os
>>> os.path.basename(file)
'go.py'
Или, если вы не запускаете код в Windows, вам придется использовать ntpath
вместо os.path
.
Комментарии:
1. При работе с путями к файлам это лучшее решение. Но просто для справки: в python также есть
rfind
метод: docs.python.org/library/stdtypes.html#str.rfind2. Как я уже сказал:
rfind
не очень хорошо выглядит с путями к файлам,os.path
решение является лучшим.
Ответ №2:
Вы могли бы разделить строку на список, а затем получить последний индекс списка.
Пример:
>>> file = 'C:UsersUserDesktopgo.py'
>>> print(file.split('\')[-1])
go.py
Комментарии:
1. Другие ответы великолепны .. но мне нравится ваш, потому что он имеет более широкое применение… не только в строках пути.
2. Спасибо, чувак 🙂 это хороший, чистый вариант, который не требует добавления зависимостей. Я думаю, что если бы вам пришлось иметь дело с ОС не только в этой ситуации, то добавление дополнительного импорта было бы лучшим вариантом.
3. Вы не должны разделять строку, а затем брать только одну ее часть. Это и медленнее, и запутаннее. Гораздо более простой метод —
x[x.rfind('\') 1:]
кстати, вы можете захотеть избежать имениfile
для вашей переменной name, потому что это затенит встроенный файловый объект.
Ответ №3:
Я согласен с Felix в том, что пути к файлам должны обрабатываться с помощью os.path.basename
. Однако, возможно, вы захотите взглянуть на встроенную строковую функцию rpartition
.
>>> file = 'C:UsersUserDesktopgo.py'
>>> before, separator, after = file.rpartition('\')
>>> before
'C:\Users\User\Desktop'
>>> separator
'\'
>>> after
'go.py'
Также существует rfind
функция, которая выдает вам последний индекс подстроки.
>>> file.rfind('\')
21
Я понимаю, что немного опоздал на вечеринку, но поскольку это один из лучших результатов при поиске, например, «find last in str python» в Google, я думаю, это могло бы помочь кому-нибудь добавить эту информацию.
Ответ №4:
Для случая общего назначения (как сказал OP, им нравится обобщение разделенного решения) …… попробуйте rfind(str)
функцию.
"myproject-version2.4.5.customext.zip".rfind(".")
редактировать: извинения, я не понял, сколько лет этому потоку… :-/
Ответ №5:
Для манипуляций с путями, которые вы хотите использовать os.path
.
Для этой конкретной проблемы вы хотите использовать os.path.basename(path)
функцию, которая вернет последний компонент пути или пустую строку, если путь заканчивается косой чертой (т.Е. путь к папке, а не к файлу).
import os.path
print os.path.basename("C:UsersUserDesktopgo.py")
Дает:
go.py