У меня есть простой код Python, который ищет файлы для строки, например path=c:\path
, где c:\path
часть может отличаться. Текущий код:
def find_path(i_file):
lines = open(i_file).readlines()
for line in lines:
if line.startswith("Path="):
return # what to do here in order to get line content after "Path=" ?
Какой простой способ получить текст после Path=
?
Ответы:
Начиная с
Python 3.9
, вы можете использоватьremoveprefix
:'Path=helloworld'.removeprefix('Path=') # 'helloworld'
источник
Если строка исправлена, вы можете просто использовать:
if line.startswith("Path="): return line[5:]
который дает вам все, начиная с позиции 5 в строке (строка также является последовательностью, поэтому эти операторы последовательности работают и здесь).
Или вы можете сначала разделить строку
=
:if "=" in line: param, value = line.split("=",1)
Тогда param - "Path", а значение - это остаток после первого =.
источник
split
вызывает исключение, если разделитель отсутствует.partition
более стабилен, он также разбивает строку и всегда возвращает трехэлементный кортеж с пре-, разделителем и пост-содержимым (некоторые из которых могут быть,''
если разделитель отсутствовал). Например,value = line.partition('=')
.Удалить префикс из строки
# ... if line.startswith(prefix): return line[len(prefix):]
Разделить на первое вхождение разделителя через
str.partition()
def findvar(filename, varname="Path", sep="=") : for line in open(filename): if line.startswith(varname + sep): head, sep_, tail = line.partition(sep) # instead of `str.split()` assert head == varname assert sep_ == sep return tail
Анализируйте INI-подобный файл с помощью ConfigParser
from ConfigParser import SafeConfigParser config = SafeConfigParser() config.read(filename) # requires section headers to be present path = config.get(section, 'path', raw=1) # case-insensitive, no interpolation
Другие варианты
str.split()
re.match()
источник
def remove_prefix(text, prefix): return text[len(prefix):] if text.startswith(prefix) else text
источник
Для нарезки (условной или безусловной) в целом я предпочитаю то, что недавно предложил коллега; Используйте замену пустой строкой. Легче читать код, меньше кода (иногда) и меньше риск указать неправильное количество символов. ОК; Я не использую Python, но на других языках предпочитаю такой подход:
rightmost = full_path.replace('Path=', '', 1)
или - чтобы продолжить первый комментарий к этому сообщению - если это нужно сделать, только если строка начинается с
Path
:rightmost = re.compile('^Path=').sub('', full_path)
Основное отличие от того, что было предложено выше, заключается в том, что здесь не задействовано "магическое число" (5) и нет необходимости указывать и '
5
' и строку 'Path=
'. Другими словами, я предпочитаю этот подход, а не обслуживание кода. точка зрения.источник
rightmost = re.sub('^Path=', '', fullPath)
. Цельcompile()
метода - ускорить работу, если вы повторно используете скомпилированный объект, но, поскольку вы выбрасываете его после использования, он все равно здесь не действует. Обычно об этой оптимизации не стоит беспокоиться.Предпочитаю
pop
индексацию[-1]
:value = line.split("Path=", 1).pop()
к
value = line.split("Path=", 1)[1] param, value = line.split("Path=", 1)
источник
startswith
что уже было протестировано, поэтомуsplit
«ничего» до и все остальное после.split("Path=", 1)
является более точным (в случае повторного появления префикса в строке позже), но повторно вводит магическое число.Или почему бы и нет
if line.startswith(prefix): return line.replace(prefix, '', 1)
источник
Как насчет..
>>> line = r'path=c:\path' >>> line.partition('path=') ('', 'path=', 'c:\\path')
Эта тройка - голова, разделитель и хвост .
источник
Самый простой способ, который я могу придумать, - это нарезка:
def find_path(i_file): lines = open(i_file).readlines() for line in lines: if line.startswith("Path=") : return line[5:]
Небольшое примечание о нотации срезов, здесь используются два индекса вместо обычного. Первый индекс указывает на первый элемент последовательности, которую вы хотите включить в срез, а последний индекс - это индекс сразу после последнего элемента, который вы хотите включить в срез.
Например:
Срез состоит из всех элементов между
first_index
иlast_index
, включаяfirst_index
и неlast_index
. Если первый индекс опущен, по умолчанию используется начало последовательности. Если последний индекс опущен, он включает все элементы вплоть до последнего элемента в последовательности. Допускаются также отрицательные индексы. Используйте Google, чтобы узнать больше по теме.источник
>>> import re >>> p = re.compile(r'path=(.*)', re.IGNORECASE) >>> path = "path=c:\path" >>> re.match(p, path).group(1) 'c:\\path'
источник
r''
строки для путей Windows. 2.re.match()
может вернуть Noneline[5:]
дает вам символы после первых пяти.
источник
Еще один простой однострочник, который здесь не упоминался:
value = line.split("Path=", 1)[-1]
Это также будет работать правильно для различных крайних случаев:
>>> print("prefixfoobar".split("foo", 1)[-1]) "bar" >>> print("foofoobar".split("foo", 1)[-1]) "foobar" >>> print("foobar".split("foo", 1)[-1]) "bar" >>> print("bar".split("foo", 1)[-1]) "bar" >>> print("".split("foo", 1)[-1]) ""
источник
line[5:]
предоставит нужную подстроку. Найдите введение и найдите "обозначение среза"источник
Если вы знаете состав списка:
lines = [line[5:] for line in file.readlines() if line[:5] == "Path="]
источник
line.startswith(...)
это в 10 раз быстрее. Мои испытания этого не подтвердили. Рад изменить его, если будут представлены доказательства, подтверждающие это утверждение.Почему бы не использовать регулярное выражение с escape?
^
соответствует начальной части строки иre.MULTILINE
соответствует каждой строке.re.escape
гарантирует точное соответствие.>>> print(re.sub('^' + re.escape('path='), repl='', string='path=c:\path\nd:\path2', flags=re.MULTILINE)) c:\path d:\path2
источник
Попробуйте следующий код
if line.startswith("Path="): return line[5:]
источник
removeprefix()
иremovesuffix()
методы струнных , добавленные в Python 3.9 из - за проблемы , связанные сlstrip
иrstrip
интерпретацией параметров , передаваемых им. Прочтите PEP 616 для более подробной информации.# in python 3.9 >>> s = 'python_390a6' # apply removeprefix() >>> s.removeprefix('python_') '390a6' # apply removesuffix() >>> s = 'python.exe' >>> s.removesuffix('.exe') 'python' # in python 3.8 or before >>> s = 'python_390a6' >>> s.lstrip('python_') '390a6' >>> s = 'python.exe' >>> s.rstrip('.exe') 'python'
removesuffix
пример со списком:plurals = ['cars', 'phones', 'stars', 'books'] suffix = 's' for plural in plurals: print(plural.removesuffix(suffix))
выход:
removeprefix
пример со списком:places = ['New York', 'New Zealand', 'New Delhi', 'New Now'] shortened = [place.removeprefix('New ') for place in places] print(shortened)
выход:
['York', 'Zealand', 'Delhi', 'Now']
источник
Поп-версия была не совсем подходящей. Я думаю, вы хотите:
>>> print('foofoobar'.split('foo', 1).pop()) foobar
источник
Я думаю, это именно то, что ты ищешь
def findPath(i_file) : lines = open( i_file ).readlines() for line in lines : if line.startswith( "Path=" ): output_line=line[(line.find("Path=")+len("Path=")):] return output_line
источник
без необходимости писать функцию, это будет разделено в соответствии со списком, в данном случае «Mr. | Dr. | Mrs.», выберите все после разделения с помощью [1], затем снова разделите и возьмите любой элемент. В приведенном ниже случае возвращается «Моррис».
re.split('Mr.|Dr.|Mrs.', 'Mr. Morgan Morris')[1].split()[1]
источник
Это очень похоже по технике на другие ответы, но без повторяющихся строковых операций, возможность определить, был ли префикс или нет, и все еще довольно читабельно:
parts = the_string.split(prefix_to_remove, 1): if len(parts) == 2: # do things with parts[1] pass
источник